2016-07-02 23 views
-3

Ich möchte wissen, ob wir eine Struktur mit 2 float-Variablen in eine andere Struktur mit 2 int-Variable Memcpy können. Das habe ich bisher jr.memcpy in float in 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; 
} 

Aber leider bekomme ich nicht das gewünschte Ergebnis. Die Ausgabe, die ich erwartet habe, ist , aber die Ausgabe sieht aus wie Müll. Kann mir jemand helfen, dieses Problem zu lösen?

Dank

+1

Warum haben Sie dieses Ergebnis erwartet? –

+0

@Oliver Ich dachte nur der ganzzahlige Teil wird kopiert. – Harry

+1

'a = b;' ist nicht dasselbe wie 'memcpy (& a, & b, ...);'. –

Antwort

3

Integer und Schwimmer haben unterschiedliche interne Darstellung und memcpy ist einfach eine bitweise Kopie also, wenn Sie die Zahlen erwartet hatten in irgendeiner Weise umgewandelt werden es nicht passieren wird.

Stattdessen müssen Sie es selbst tun, z. B. indem Sie einen Konstruktor oder einen Funktions- oder Zuweisungsoperator deklarieren, mit dem Sie Stfloats Stint zuweisen können. Auf diese Weise können Sie auch explizit die gewünschte Konvertierung angeben.

Im Allgemeinen ist es eine schlechte Idee, memcpy zu verwenden (unter anderem, weil es nur für PODs funktioniert, und auch, weil Sie diese Art von Problem bekommen). Es ist eine C-Sache, die in C++ vermieden werden sollte.

+0

@Gujit Ich möchte nicht jedes Feld einzeln in die Strukturvariable kopieren. Gibt es einen anderen Weg, auf dem ich alle Daten direkt in einer einzigen Zeile kopieren kann? – Harry

+1

@Harry: Nein, wie diese Antwort sagt. –

+1

Wenn Sie einen Assignment-Operator hinzufügen, können Sie damit alle Daten in einer einzigen Zeile kopieren, wo Sie möchten. Sie müssen nur drei (mehr oder weniger) zusätzliche Zeilen ausgeben, die diesen Zuweisungsoperator definieren. –

1

Nein, können Sie nicht, aber Sie können eine Funktion schreiben, die es für Sie tun:

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

dann, nennen es durch Ihre Strukturen durch Referenzen Zeiger vorbei (sonst wird es nur Arbeit auf Kopien der Strukturen):

struct stFloat f; 
struct stFloat i; 

cpy(&f,&i); 
+0

Das sind Zeiger, keine Referenzen. –

+0

@LightnessRacesinOrbit: Im Körper der Funktion ja, aber ist es nicht die richtige Terminologie, wenn wir Argumente Adresse mit & übergeben? –

+0

Nicht in C++, nein. Am besten vermeiden Sie es deshalb auch in C (in dem es mehrdeutig ist). –