2016-07-02 4 views
-3

Je veux savoir si on peut memcpy une structure contenant 2 variables float dans une autre structure contenant 2 variable int. C'est ce que j'ai écrit jusqu'à maintenantmemcpy ing float dans int

struct stFloat 
{ 
float a; 
float b; 
}; 


struct stInt 
{ 
int a; 
int b; 
}; 


int main() 
{ 
struct stFloat aa; 
aa.a=12.234; 
aa.b=673.797; 

struct stInt bb; 

memcpy(&bb,&aa,sizeof(stFloat)); 

printf("%d %d\n",bb.a,bb.b); 

return 0; 
} 

Malheureusement, je n'obtiens pas le résultat escompté. La sortie que j'attendais est mais la sortie ressemble à une poubelle. Quelqu'un peut-il m'aider à résoudre ce problème?

Merci

+1

Pourquoi attendiez-vous ce résultat? –

+0

@Oliver Je pensais que seule la partie entière serait copiée. – Harry

+1

'a = b;' n'est pas la même chose que 'memcpy (& a, & b, ...);'. –

Répondre

3

entiers et flottants ont une représentation différente interne et memcpy est tout simplement une copie si vous bitwise attendiez les chiffres à convertir en quelque sorte, il ne va pas se passer. A la place, vous devez le faire vous-même, par exemple en déclarant un constructeur ou une fonction ou un opérateur d'assignation qui vous permet d'assigner stfloats à stint. Cela vous permet également d'indiquer explicitement la conversion que vous voulez.

En général, c'est une mauvaise idée d'utiliser memcpy (entre autres, parce que cela ne fonctionne que pour les POD, et aussi parce que vous avez ce genre de problème). C'est une chose C qui devrait être évitée en C++.

+0

@Gujit Je ne veux pas copier individuellement chaque champ dans la variable struct. Donc, y a-t-il un autre moyen de copier directement toutes les données sur une seule ligne? – Harry

+1

@Harry: Non, comme le dit cette réponse. –

+1

Si vous ajoutez un opérateur d'affectation, vous pouvez l'utiliser pour copier toutes les données sur une seule ligne où vous voulez. Vous n'avez qu'à dépenser trois (plus ou moins) lignes supplémentaires définissant cet opérateur d'affectation. –

1

Non, vous ne pouvez pas, mais vous pouvez écrire une fonction qui le fera pour vous:

void cpy(struct stFloat *src, struct stInt *dest){ 
dest->a = (int)src->a; 
dest->b = (int)src->b; 
} 

puis, appelez-en passant par vos structures références pointeur (sinon il ne fonctionnera sur les copies des structures):

struct stFloat f; 
struct stFloat i; 

cpy(&f,&i); 
+0

Ce sont des pointeurs, pas des références. –

+0

@ LightnessRacesinOrbit: Dans le corps de la fonction, oui, mais n'est-ce pas la bonne terminologie lorsque nous passons l'adresse des arguments avec &? –

+0

Pas en C++, non. Il vaut mieux l'éviter en C aussi (dans lequel il est ambigu) pour cette raison. –