Forum: PC-Programmierung Structelemente in Array kopieren


von Martin H. (Gast)


Lesenswert?

Hallo,
wie kann man Elemente aus einem Struct in ein Array kopieren?

z.B.:
1
struct test
2
{
3
char a;
4
char b;
5
6
} 
7
8
struct test tStruct={1,1};
9
10
char Array[2];
11
12
13
void foo(void)
14
{
15
Array[0]=tStruct.a;
16
Array[1]=tStruct.b;
17
18
}

Geht das auch eleganter, z.B. mit memcopy oder so?

Grüße

von Klaus W. (mfgkw)


Lesenswert?

memcpy heißt die Funktion.

Allerdings sollte man dabei wissen, was man tut.
In deinem Beispiel geht es gut, aber je nach struct steht es dem 
Compiler frei zwischen den Elementen der struct Füllbytes einzubauen (um 
z.B. nach einem char das nächste int-Element auf einer geraden Adresse 
beginnen zu lassen). Das muß man natürlich im Blick behalten.

von Martin H. (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Allerdings sollte man dabei wissen, was man tut.
> In deinem Beispiel geht es gut, aber je nach struct steht es dem
> Compiler frei zwischen den Elementen der struct Füllbytes einzubauen (um
> z.B. nach einem char das nächste int-Element auf einer geraden Adresse
> beginnen zu lassen). Das muß man natürlich im Blick behalten.

Wenn alle Elemente von gleichen Typ sind, macht der Compiler das dann 
auch?
Ansonsten muss man wohl mit volatile herumspielen?

Viele Grüße

von Klaus W. (mfgkw)


Lesenswert?

Mit volatile hat das überhaupt nichts zu tun.

Martin H. schrieb:
> Wenn alle Elemente von gleichen Typ sind, macht der Compiler das dann
> auch?

Insbesondere, wenn alles gleiche Typen sind, wird es kaum Probleme 
geben.

von Martin H. (Gast)


Lesenswert?

Vielen Dank Klaus!
Das funktioniert hervorragend (bis zur Optimierungsstufe 4).

Aber mehr benötige ich nicht, wer weiß was der Compiler da fabriziert!

Viele Grüße

von Klaus W. (mfgkw)


Lesenswert?

Meinst du bei 99 wird noch besserer Code rauskommenß
Bei welchem Compiler denn?

Abgesehen davon sehe ich da kein Problem bzgl. Optimierung.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Martin H. schrieb:

> Wenn alle Elemente von gleichen Typ sind, macht der Compiler das dann
> auch?

Unter Umständen ja, wenn zB dieser Typ schräge größe hat (zB gepackte 
Struktur mit 3 Bytes).

> Ansonsten muss man wohl mit volatile herumspielen?

Nein. volatile ändert nichts am Strukturlayout.

1
typedef struct
2
{
3
   char a;
4
   char b;
5
} test_t;
6
7
test_t test = { 1, 1 };
8
9
char array[sizeof (test_t)];

von Klaus (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Insbesondere, wenn alles gleiche Typen sind, wird es kaum Probleme
> geben.

Hervorragender Hinweis für sauberen, portablen C-Code.

MfG Klaus

von bitte löschen (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.