Varianten

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Varianten - Index

Die Variante (union) ist ein abgeleiteter Typ, der in vielen syntaktischen und funktionalen Eigenschaften mit dem Strukturtyp übereinstimmt. Der hauptsächliche Unterschied zur Struktur ist, dass in der Variante zu einem gegebenen Zeitpunkt nur eines der Elemente "aktiv" sein kann. Die Größe einer Variante wird von der Größe ihres größten Elements bestimmt. Es kann jeweils nur der Wert eines der Elemente gespeichert werden. Im folgenden Beispiel



 union myunion {     /* Varianten-Tag = myunion */
    int i;
    double d;
    char ch;
 } mu, *muptr=μ



kann der Bezeichner mu, der vom Typ union myunion ist, dazu benutzt werden, n-Byte-int, einen 8-Byte-double oder einen Einzel-Byte-char zu speichern (aber nur jeweils einen dieser drei Typen).

Anmerkung:  Varianten entsprechen den Variant-Datensatztypen von Delphi.

sizeof(union myunion) und sizeof(mu) geben beide 8 zurück. Allerdings sind 4 Bytes davon ungenutzt, wenn mu verwendet wird, um ein int-Objekt zu speichern bzw. 7 Bytes, wenn mu verwendet wird, um einen char zu speichern. Auf die Elemente einer Variante wird genauso zugegriffen wie auf die Elemente einer Struktur (. und ->). Aber es ist Vorsicht geboten:



 mu.d = 4.016;
 printf("mu.d = %f\n",mu.d); //OK: zeigt an mu.d = 4.016printf("mu.i = %d\n",mu.i); //unbrauchbares Ergebnis mu.ch = 'A';
 printf("mu.ch = %c\n",mu.ch); //OK: zeigt an mu.ch = Aprintf("mu.d = %f\n",mu.d); //unbrauchbares Ergebnis muptr->i = 3;
 printf("mu.i = %d\n",mu.i); //OK: zeigt an mu.i = 3



In diesem Beispiel ist das zweite printf zwar erlaubt, weil mu.i wirklich ein Integertyp ist. Allerdings entspricht das Bitmuster in mu.i einem Teil des vorher zugewiesenen double und dürfte wohl selten ein brauchbares Resultat ergeben.

Bei einer korrekten Konvertierung zeigt ein auf eine Variante gerichteter Zeiger auf jedes Element dieser Variante und umgekehrt.