Unions

Hallo,
ich hab jetzt schon mehrfach gegoogelt und hab rausgefunden, dass man in einer Union Variablen anlegen kann, die sich dann den gleichen Speicherbereich teilen und die Union genauso groß ist wie der größte Datentyp in ihr.
Wenn ich so eine Union verwende und in ihr hab ich ein float-Array und ein DWord-Array und ich schreibe an einer Stelle was ins float-Array, was passiert dann mit dem DWord-Array wenn ich z.B ein anderes Element daraus auslesen will?
Wie ist das organisiert, woher weiß ich, welchen Datentyp ich jetzt im Moment von der Union erhalte?

Vielen Dank für eine Antwort,
Viele Grüße
Manny

Hallo Manny,

ich hab jetzt schon mehrfach gegoogelt und hab rausgefunden,
dass man in einer Union Variablen anlegen kann, die sich dann
den gleichen Speicherbereich teilen und die Union genauso groß
ist wie der größte Datentyp in ihr.

Stimmt.

Wenn ich so eine Union verwende und in ihr hab ich ein
float-Array und ein DWord-Array und ich schreibe an einer
Stelle was ins float-Array, was passiert dann mit dem
DWord-Array wenn ich z.B ein anderes Element daraus auslesen
will?

Das andere Element wird dadurch nicht geändert.

Wie ist das organisiert, woher weiß ich, welchen Datentyp ich
jetzt im Moment von der Union erhalte?

Tja, das ist das Problem des Programmierers.

Allerdings machen deine Überlegungen nicht einen praktischen Sinn :wink:

In meinen Programmen findet man soetwas häufiger:

typedef union
{
 struct
 {
 int flag1 :1;
 int flag2 :1;
 int flag3 :1;
 int flag4 :1;
 } f;
 int all; 
} uFLAGS;

......
uSLAGS flags;
......
if ( flags.all )
 {
 // mindestens ein Flag ist gesetzt
 if ( flags.f.flag1 ) ......
 }

Eine andere Variante ist, wenn man einen float Byteweise zerlegen muss, weil er z.B. über ein 8-Bit Schnittstelle übertragen werden muss.

typedef union
 {
 float d;
 char c[4];
 } uDATA
uDATA data;
......
 data.d = 3.141;

 send(data.c[0]);
 send(data.c[1]);
 send(data.c[2]);
 send(data.c[3]);

Allerdings benötigt diese Vorgehen genaue Kenntnisse über die CPU und den Compiler und ist nicht für portablen Code du verwenden.

MfG Peter(TOO)

Hallo Manny,

natürlich überschreibst du den Wert des gerade nicht aktuellen Typs - es ist ja der Sinn des Ganzen, den gleichen Speicherplatz zu benutzen. Man kann das, wenn man sehr sorgfältig überlegt, zur Datenwandlung benutzen, etwa 32bit oder 2 x 16bit, der Zugriff auf die 16bit-Anteile entspricht dann den üblichen Lo/Hi-Funktionen (wenn man einen 32bit-Wert reingeschrieben hat). Ich benutze das (in Pascal) u.a. zur einfachen Umwandlung von Realzahlen in 4 Bytes zur Datenübertragung.

In allen anderen Fällen, besonders wenn die Variablen unterschiedlich gross sind, macht der wechselnde Zugriff keinen Sinn, dann bleibt nur die Speicherersparnis.

Was gelesen oder geschrieben wird, liegt nur am Programmierer, also auch möglicherweise Unsinn (soll beim Programmieren auch so gelegentlich vorkommen). Möchte man das komfortabler, so gibt es in vielen Sprachen Variants, die auch speichern, was der Inhalt darstellt, sogar „Nichts“ und „Nicht initialisiert“.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]