Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [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

 

Typ: Anweisung
Kategorie: Speicherverwaltung
Syntax:

UNION [UnionName] [FIELD = { 1 | 2 | 4 } ]
   Element1  [AS Typ]
   [Element2 [AS Typ]]
   [...]
END 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
   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 BefehlsreferenzeintragStrings 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 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 QuickBASIC:
- neu in FreeBASIC

Siehe auch:
BefehlsreferenzeintragTYPE, BefehlsreferenzeintragFIELD, BefehlsreferenzeintragOPERATOR


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