Referenz - UNION
Syntax:
UNION [UnionName] [EXTENDS type_union] [FIELD = {1|2|4}]
Element1 [AS Typ]
[Element2 [AS Typ]]
[...]
END UNION
Typ: Anweisung
Kategorie: Klassen
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.
- 'UnionName' ist der Bezeichner der UNION, für den dieselben Regeln wie für den Bezeichner eines TYPE gelten. Dieser Bezeichner muss immer dann angegeben werden, wenn die UNION selbst den UDT darstellt. Ist die UNION Teil eines anderen UDTs, so darf sie keinen eigenen Bezeichner besitzen
- EXTENDS wird in Verbindung mit Vererbung verwendet. Das Union kann so von anderen UNIONs und TYPEs erben.
- FIELD bestimmt, auf welche Größe das Feld ausgedehnt werden soll ("Padding").
- 'Element1', 'Element2', ... sind die Namen der Attribute, über die auf die UNION-Felder zugegriffen wird. Dies können auch Konstruktoren, Destruktoren, SUBs, FUNCTIONs und andere sein, die auch in UDTs erlaubt sind.
- 'Typ' legt den Datentyp des Elements fest. Er darf ein beliebiger FreeBASIC-Datentyp oder ein UDT sein.
Wie bereits erwähnt kann eine UNION auch Teil eines anderen UDTs sein; die einzelnen Elemente werden einfach ineinander geschachtelt:
TYPE TypeName
Attr1 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 Attribute 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 Attribute.
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 stattdessen nach Möglichkeit in Ihren UNIONs Strings fester Länge 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, EXTENDS, FIELD, OPERATOR, Datentypen und Deklarationen
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|