Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - UNION

Referenz-Navigation

 

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 BefehlsreferenzeintragUDT, 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
  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 BefehlsreferenzeintragStrings 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 BefehlsreferenzeintragINTEGER und als BefehlsreferenzeintragUBYTE behandelt werden, ohne dazu die BefehlsreferenzeintragCAST-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 Befehlsreferenzeintrag-lang qb steht UNION nicht zur Verfügung und kann nur über __UNION aufgerufen werden.

Siehe auch:
BefehlsreferenzeintragTYPE, BefehlsreferenzeintragEXTENDS, BefehlsreferenzeintragFIELD, BefehlsreferenzeintragOPERATOR, BefehlsreferenzeintragDatentypen und Deklarationen


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 21.07.2007 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 05.08.2020 von Redakteurnemored gespeichert.
  Versionen Versionen