c++ unsigned char copie de la mémoire
J'ai besoin de passer un unsigned char tableau à partir d'une méthode à l'autre, et j'ai essayé d'utiliser ce code:
{
unsigned char *lpBuffer = new unsigned char[182];
ReceiveSystemState(lpBuffer);
}
BOOL ReceiveSystemState(unsigned char *lpBuffer)
{
unsigned char strRecvBuffer[182] = { 0 };
//strRecvBuffer construction
memcpy(lpBuffer, strRecvBuffer, sizeof(strRecvBuffer));
return TRUE;
}
Aucun de ces 3 méthodes (utilisé dans ReceiveSystemState
) fonctionné comme je l'espérais. Après l'utilisation de chacun d'eux tout ce qu'il est copié est le premier char de strRecvBuffer
et rien de plus. Le strRecvBuffer
a vide caractères d'un élément, mais j'ai besoin de ceux qu'ils sont, parce que cette chaîne est un message à partir d'un périphérique matériel, et ce message sera anallysed à l'aide d'un protocole. Ce qui me manque ici? Dois-je initialiser lpBuffer
mal?
EDIT: j'ai utilisé un simple memcpy
méthode pour faire le travail. Toujours le même résultat: tout ce qui est copié est le premier char de strRecvBuffer
.
EDIT2: code du Travail:
{
unsigned char *lpBuffer = new unsigned char[182];
ReceiveSystemState(lpBuffer);
for (int i = 0; i < 144; i++)
{
memcpy(&c_dateKG[i], lpBuffer + i * sizeof(unsigned char), sizeof(unsigned char) );
}
}
BOOL ReceiveSystemState(unsigned char *lpBuffer)
{
unsigned char strRecvBuffer[182] = { 0 };
//strRecvBuffer construction
memcpy(lpBuffer, strRecvBuffer, sizeof(strRecvBuffer));
return TRUE;
}
- ne pense pas que cela fera une différence depuis
unsigned char
a 1 octet taille. donc, fondamentalement,182 * sizeof(unsigned char)
est la même que182
. - Je n'ai pas cette. Où dois-que viennent les données? Vous définissez strRecvBuffer pour contenir un 0 et les ordures par la suite. Autres que que, memcpy copie tous de la matrice, que votre boucle.
= { 0 }
est la syntaxe pour définir tous les éléments à 0memcpy( lpBuffer, strRecvBuffer, 182 )
devrait faire le travail. Il y a quelque chose d'autre que vous n'êtes pas à nous montrer. Aussi: pourquoi avez-vous jeté àvoid
parfois, et pas d'autres? Pourquoi avez-vous attribuerNULL
à une variable qui est immédiatement aller hors de portée, et pourquoi avez-vous vérifier la valeur null avant dedelete[]
(où un pointeur null est légal), et pas plus tôt? Pour cette question, pourquoi avez-vous vérifier la valeur null à tous, depuisnew[]
est garanti de ne jamais retourner un pointeur null? Et peut-être le plus important: pourquoi êtes-vous à l'aide denew[]
, au lieu destd::vector< unsigned char >
?- les données proviennent d'un port série à l'aide d'une autre méthode, et la déclaration est pour initializind tous les éléments avec
0
. - ce que je ne vous montrent pas, est une méthode qui lit les données à partir d'un port série, et renvoie
strRecvBuffer
. Qui ne devrait pas interférer avec le reste du code. - Peut-être, mais il n'y a aucune raison dans le code que vous montrez
memcpy
de ne pas travailler. Debug
définir un point d'arrêt àmemcopy
et vérifier le contenu delpbuffer
premier.- fait cela, et a comparé les 2 tableaux.
- concernant "une méthode qui lit les données à partir d'un port série, et renvoie strRecvBuffer." dans le code ci-dessus strRecvBuffer est une variable locale, nous sommes donc supposer que vous êtes de passage à l'invisible méthode? Le code ci-dessus n'est pas le code à partir de votre source à l'origine de votre problème. Je n'ai aucun doute que vous avez un problème, mais dans le processus de rognage ce que vous jugés sans importance le code avant de le poster ici, vous avez raccordé le problème ainsi. Tous les doutes que je vous suggère de créer un seul fichier avec simplement le code ci-dessus et exécutez-la. fournit à la fois de la dyn-alloc et statique 182 octets. des œuvres.
- cette méthode n'était pas le problème en effet. J'ai édité ma question avec le code de travail.
Vous devez vous connecter pour publier un commentaire.
Votre code est absolument ordures. Quelques remarques:
Utilisation
sizeof
:Utilisation
sizeof(static_massive_name);
oucount_of_arr_elements * sizeof(arr_type);
Par exemple:
Mise à JOUR:
L'intégralité du code source pour les tests:
Résultat:
BOOL ReceiveSystemState(unsigned char *lpBuffer)
,lpBuffer
est passé comme un pointeur vers un tableau de caractères, de sorte que le débogueur montré que "seul le premier char" était en effet le premier char de l'ensemble de la zone mémoirelpBuffer
souligné. (mon explication ne peut pas être trop précis). Donc il n'y a pas d'autre problème que ... eh bien, moi! J'ai juste besoin d'utilisermemcpy(&c_dateKG[i], lpBuffer + i * sizeof(unsigned char), sizeof(unsigned char) );
copier les valeurs de la matrice de retour à partir de la mémoire. J'ai mis à jour mon post avec le corect utiliser de code. Merci!