UNION

FreeBASIC-Referenz » Alphabetische Befehlsreferenz » U » 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.

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 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, url=ref:634]EXTENDS[/url], [link]ref:236;FIELD[/link], [link]ref:544;OPERATOR[/link], [url=ref:572]Datentypen und Deklarationen[/url]