2010-12-14 39 views
1

Je suis en train de copier les données de la structure à l'autre. Les octets sont identiques que chaque structure peut gérer sont les mêmes. Mes déclarations et memcpy sont ci-dessous:compilateur d'erreur, ne peut pas convertir le paramètre 2 de MyStruct1 à const void *, pour memcpy

typedef struct{ 
     CString strNumber; 
     CString strAlpha; 

    } _Number; 

    typedef struct{ 
     CString strIterration; 
     _Number NumberOne; 
     _Number NumberTwo; 
    } _Store; 

_Store Data1; 
_Store Data2; 

Maintenant, nous allons dire que la première Données1 struct a données et le second est tout simplement déclaré.

J'utilise le code suivant:

memcpy(&Data2, Data1, sizeof(_Store)); 

Je ne peux pas compiler comme l'erreur apparaît. Des idées? D'autres approches pour copier les données?

+0

Les noms '' _Number' et _Store' sont illégales dans votre code (préfixes '_A' -' _Z' réservée à un usage interne du compilateur). De plus, en C++, vous n'avez pas besoin de typedef struct. Donc: 'struct Number {CString strNumber; CString strAlpha; }; ' – MSalters

Répondre

7

Vous devez utiliser & sur les deux struct:

memcpy(&Data2, &Data1, sizeof(_Store)); 

Attention: _Store contient variable membre CString qui (si elle est comme MFC CString) n'est pas au niveau du bit copiable. Vous devez uniquement utiliser memcpy() sur les types qui sont copiables sous forme de bits, sinon vous risquez de rencontrer un comportement indéfini.

+0

Cela fonctionne, merci beaucoup! Quelques questions de côté: Data1 n'est pas modifié pourquoi est appelé comme référence? Et encore, un comportement indéfini? Sens? Mon retour exe mal: – Sunscreen

+0

@Sunscreen: Soi-disant, 'CString' est plus qu'un tas d'octets (il contiendra probablement un pointeur vers une mémoire allouée sur le tas), et vous ne pouvez pas simplement' memcpy' il. La réponse de Geoff a la bonne approche: il suffit d'utiliser l'opérateur d'affectation. – sbi

+0

/* * Si cette ASSERT échoue, un mauvais pointeur a été transmis. Il peut être * totalement faux, ou il peut avoir été attribué à un autre tas. * Le pointeur DOIT provenir du tas 'local'. */ _ASSERTE (_CrtIsValidHeapPointer (pUserData)); – Sunscreen

2

L'autre approche évidente est une simple affectation, à savoir, Data2 = Data1;

Cela vous évite de prendre soin combien d'octets sont dans la structure _Store et aussi de savoir si CString a un opérateur =.