UNION

FreeBASIC-Referenz » Alphabetische Befehlsreferenz » U » UNION

Typ: Anweisung
Kategorie: Speicherverwaltung
Syntax:

UNION [UnionName] [FIELD = { 1 | 2 | 4 } ]
   Element1  [AS Typ]
   [Element2 [AS Typ]]
   [...]
END UNION

Definiert einen UDT, dessen Elemente sich eine Speicherstelle teilen. Da die Elemente denselben Speicherplatz belegen, wird durch die Änderung eines Elements auch jedes andere Element geändert.

Eine UNION kann auch Teil eines anderen UDTs sein.

Wie bereits erwähnt kann eine UNION auch Teil eines anderen UDTs sein; die einzelnen Elemente werden einfach ineinander geschachtelt:

TYPE TypeName
   Record1 AS Typ
   UNION
      UnionElement1 AS Typ
      UnionElement2 AS Typ
   END UNION
END TYPE

Solche verschachtelten UNIONs wie im obigen Beispiel dürfen keinen eigenen Namen besitzen. Auf 'UnionElement1' und 'UnionElement2' wird über 'TypeName' zugegriffen; sie zählen formal auch als Records von 'TypeName', teilen sich allerdings dieselbe Speicherstelle.

Beispiel:

' Eine UNION definieren
UNION AUnion
a As UBYTE
b As INTEGER
END UNION

' Ein normaler UDT, der später in einer UNION
' verwendet wird.
TYPE Words
LoWord AS SHORT
HiWord AS SHORT
END TYPE

' Einen verschachtelten UDT definieren
TYPE CompType
s AS STRING * 20
' Flag zur Anzeige, was in der Union
' benutzt werden soll
uType AS BYTE
UNION
au AS UBYTE
bu AS INTEGER
cu AS WORDS
END UNION
END TYPE


' Flags zur Anzeige, was in der Union benutzt
' werden soll. Es kann nur ein Element einer
' Union benutzt werden
CONST IsInteger = 1
CONST IsUByte = 2
CONST IsUDT = 3

DIM AS AUnion MyUnion
DIM AS CompType MyComposite

' Wird ein Wert einer Union geändert...
MyUnion.a = 128
' ... ändern sich auch alle anderen Records.
PRINT MyUnion.b
PRINT

MyComposite.s = "Type + Union"
' Anhand dieses Flags könnte das Programm später
' erkennen, dass es den UNION-Wert wie einen
' INTEGER behandeln soll.
MyComposite.uType = IsInteger
MyComposite.bu = 1500 ' Der Wert der UNION selbst.

PRINT "Zusammengesetzter Typ: ";
SELECT CASE MyComposite.uType
CASE IsInteger
PRINT MyComposite.bu
CASE IsUByte
PRINT MyComposite.au
CASE IsUDT
PRINT MyComposite.cu.LoWord, _
MyComposite.cu.HiWord
CASE ELSE
PRINT "Unbekannter Typ ..."
END SELECT
PRINT

PRINT "Wenn bei der Typenpruefung gemurkst wird:"
PRINT "MyComposite:"
PRINT ".au (UBYTE) "; MyComposite.au
PRINT ".bu (INTEGER)"; MyComposite.bu
PRINT ".cu.LoWord (SHORT) "; MyComposite.cu.LoWord
PRINT ".cu.HiWord (SHORT) "; MyComposite.cu.HiWord

SLEEP

Ausgabe:

128

Zusammengesetzter Typ:  1500

Wenn bei der Typenpruefung gemurkst wird:
MyComposite:
.au        (UBYTE)  220
.bu        (INTEGER) 1500
.cu.LoWord (SHORT)   1500
.cu.HiWord (SHORT)   0

Beachten Sie, dass Strings unbestimmter Länge schwierig zu verwalten sind. Sie sollten nach Möglichkeit fixed-length-Strings in Ihren UNIONs verwenden.

UNIONs können verwendet werden, wenn eine Information oft in Form verschiedener Datentypen benötigt wird. Z. B. kann die Information '128', die in 'MyUnion' gespeichert ist, bequem als INTEGER und als UBYTE behandelt werden, ohne dazu die CAST-Funktion verwenden zu müssen. Der vermeintlich zusätzliche Aufwand, der mit dem Flag 'uType' in 'MyComposite' verbunden ist, muss tatsächlich sowieso aufgebracht werden, da auf die eine oder andere Weise erkannt werden muss, wie die Information zu handhaben ist. Praktisch ist auch die Möglichkeit, auf einzelne Bestandteile zuzugreifen, wie es in diesem Beispiel mit dem UDT 'Words' geschieht.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen: In der Dialektform -lang qb steht UNION nicht zur Verfügung und kann nur über __UNION aufgerufen werden.

Siehe auch:
TYPE, FIELD, OPERATOR