Forum: Mikrocontroller und Digitale Elektronik Elemente in Union an gleicher Speicherstelle


von Frank89 (Gast)


Lesenswert?

Hallöchen,
ich bin total verwirrt bzgl. unions.
Ich habe folgende Situation:
1
struct a1
2
{
3
unsigned int x1;
4
unsigned int x2;
5
6
};
7
8
struct a2
9
{
10
unsigned int x3;
11
unsigned int x4;
12
13
};
14
15
16
17
union p
18
{
19
struct a1 testa1;
20
struct a2 testa2;
21
22
};
23
24
union p testp;

Aus irgendwelchen Gründen liegt die Elemente x1 und x3 auf der selben 
Speicherstelle.
D.h. wenn ich schreibe: testp.a1.x1=1, ändert sich auch x3.
Das union die Daten hintereinander im Speicher anordnet ist mir klar, 
aber hintereinander und nicht übereinander!?
Was läuft da falsch?

Vielen Dank für eure Antworten!

von Uwe (Gast)


Lesenswert?

Eine Union ist dafür da Daten im Speicher Übereinander zu legen. Ist 
also alles richtig. Man kann zum beispiel ein Byte Array aus vier 
Elementen über ein 32 Bit Int legen und so konvertieren. Ob es sinnvoll 
ist muss man selber entscheiden.

von Joey5337 (Gast)


Lesenswert?

Hallo,

es ist so:
ein struct macht die Daten hintereinander.
eine union macht die Daten übereinander, d.h. es gibt dann mehrere 
Möglichkeiten, auf die gleiche Speicherstelle zuzugreifen.

Dabei können die 2 gleichzeitig auf den Speicher zugreifenden Structs 
sogar  unterschiedlich sein, so kann man z.B. elegant auf einzelne Bytes 
eines Words zugreifen, je nach Compiler sogar auf einzelne Bits.

Das von dir beschriebene Verhalten ist genau das, das ich erwarten 
würde.

Grüße, Joey

von (prx) A. K. (prx)


Lesenswert?

@Frank89: Erklär mal, was du eigentlich erreichen wolltest.

von Frank89 (Gast)


Lesenswert?

Joey5337 schrieb:
> ein struct macht die Daten hintereinander.
> eine union macht die Daten übereinander, d.h. es gibt dann mehrere
> Möglichkeiten, auf die gleiche Speicherstelle zuzugreifen.

Das habe ich dann verwechselt. :(

A. K. schrieb:
> @Frank89: Erklär mal, was du eigentlich erreichen wolltest.

Ich habe diverse Funktionen die auf verschiedene Elemente der Structs 
zugreifen sollen.
Um den Funktionen nicht jedes mal 99 Adressen (also structs) übergeben 
zu müssen, wollte ich das also quasi "verpacken" um nur immer eine 
Adresse zu übergeben zu müssen.
Werde mir nun wohl Gedanken machen müssen.
Eventuell kann man das in Arrays verpacken?

Viele Grüße & vielen Dank!

von AVerr (Gast)


Lesenswert?

Du kannst structs ihrerseits wieder in structs packen ...
Ich glaube das ist auch das, was du am Anfang vorhattest, also aus dem 
union einfach ein struct machen.

von Frank89 (Gast)


Lesenswert?

AVerr schrieb:
> Du kannst structs ihrerseits wieder in structs packen ...
> Ich glaube das ist auch das, was du am Anfang vorhattest, also aus dem
> union einfach ein struct machen.

Ja, das hatte ich am Anfang auch vor...
Habe das gerade gemacht und wuala siehe da, es läuft! ;)

Vielen Dank euch allen!
Es wird Licht im Dunkeln.

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.