2010-07-06 4 views
-1

J'ai une fonction de rappel qui a le paramètre const unsigned char *pData. chaque fois que j'appuie sur la fonction de rappel, j'ai besoin de stocker la valeur pData dans ma variable locale unsigned char*. Y a-t-il une fonction pour copier les données?comment copier des données?


Edit: Voici un exemple de code:

void Callbackfun(int x, const unsigned char* pData, const UINT cbData) { 
    switch(x) { 
    case 0: 
     // ptr is a global variable of structure containg name and number 
     ptr.name = (unsigned char*)pData; 
     break; 
    case 1: 
     ptr.number = (unsigned char*)pData; 
     break; 
    } 
} 

maintenant à chaque fois que cette fonction est appelée je veux stocker les pData valeurs dans ma structure locale (comme le montre ptr.name).

+0

que voulez-vous dire par «copier les données». Pourquoi n'utilisez-vous pas directement l'opérateur '='? –

+0

Vous aurez besoin de poster un code. –

+0

Je ne suis pas sûr de bien comprendre la question. est 'char c = * p;' que voulez-vous faire? – Naveen

Répondre

2

Dans votre fonction de rappel, vous devrez allouer de la mémoire locale pour vos "données". De cette façon, vous pouvez le conserver lorsque la fonction d'appel quitte la portée. Si vous connaissez la longueur des données et que la longueur est cohérente, vous avez deux options. Allocation dynamique, ou allouer sur la pile. L'exemple de code n'est pas testé.

Voici l'allocation dynamique et la copie.

unsigned char* localData = new unsigned char[42]; 
memcpy(localData, pData, 42); 

est ici la pile la version allouée

unsigned char localData[42]; 
memcpy(&localData, pData, 42); 

Je suppose que vous n'êtes pas passer les données de chaîne puisque vous utilisez unsigned char. Puisque vous ne traitez qu'un pointeur, vous devez connaître la taille du tampon pour chaque allocation.

Si vous n'avez pas de longueur de données constante, vous devez transmettre ce paramètre en tant que second paramètre à votre fonction de rappel.

+0

@sbi J'ai écrit l'exemple en supposant des données de chaîne de longueur variable, puis réalisé ce ne peut pas être des données de chaîne. Je vais supprimer l'initialisation de la mémoire. – nathan

+0

char * a = NULL; \t char * s = NULL; \t a = (char *) calloc (1, (taille de (caractère))); S = (char *) calloc (1, (sizeof (char))); \t a = "DONNÉES"; \t memcpy (s, a, (strlen (a))); \t printf ("% s", s); Pouvez-vous me dire pourquoi son impression DONNÉES ½½½½½½½½½ ■ ε ■ ???? Comment imprimer uniquement des données? Merci – SPB

+0

@SPB Je suggère d'ajouter le code que vous avez dans votre commentaire à la question. Cela permettra à d'autres de mieux répondre à votre question. La réponse courte est votre chaîne n'est pas nulle terminée. Lorsque vous appelez memcpy, vous tronquez votre caractère nul pour que printf continue à imprimer. – nathan

1

Si vous pouvez modifier le struct que ptr semble être une instance, je suggère ceci:

#include <string> 

struct ptr_type { 
    std::string name; 
    std::string number; 
}; 

ptr_type ptr; 

Et pour le rappel, en supposant cbData nous indique la taille de la mémoire tampon pointée par pData:

void Callbackfun(int x, const unsigned char* pData, const UINT cbData) { 

    // The following line will copy the buffer pointed to by 
    // pData into an std::string object: 
    std::string data(pData, cbData); 

    switch(x) { 
    case 0: 
     // Simple assignment of std::string objects copies the 
     // entire buffer: 
     ptr.name = data; 
     break; 
    case 1: 
     ptr.number = data; 
     break; 
    } 
} 
Questions connexes