Programmierkurs: Delphi: Pascal: Varianten

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Varianten[Bearbeiten]

Was sind Varianten?[Bearbeiten]

Varianten sind dynamische Variablentypen. Das heißt, eine Variante kann verschiedene Variablentypen (Integer, String, usw.) annehmen. Strukturierte Datentypen, wie Records, Mengen, statische Arrays, Dateien, Klassen, Klassenreferenzen und Zeiger können jedoch nicht zugewiesen werden.

Verwendung[Bearbeiten]

Varianten werden häufig eingesetzt, wenn während der Entwicklung von Programmen der Datentyp einer Variable nicht bekannt ist oder sich während der Laufzeit ändert. Varianten bieten demnach die größtmögliche Flexibilität, jedoch verbrauchen sie mehr Speicher und verhalten sich während Operationen deutlich langsamer als statische Variablentypen.

Eine Variante benötigt 16 Bytes im Speicher und besteht aus einem Typencode und einem Wert oder einem Zeiger auf einen Wert, dessen Typ durch den Code festgelegt ist. Wenn eine Variante leer ist, bekommt sie den speziellen Wert Unassigned. Der Wert Null weist auf unbekannte oder fehlende Daten hin.

Um Varianten verwenden zu können, muss man die Unit Variants in die Uses-Klausel einbinden, falls diese dort noch nicht vorhanden ist. Die Zuweisung von Varianten erfolgt wie bei allen Variablen.

var
  vExample: Variant;
begin
  vExample := 'Hallo';      // Stringzuweisung
  vExample := 3.141592;     // Gleitkommazuweisung
  vExample := 666;          // Integerzuweisung
end.


Beim Auslesen von Varianten wird es schon komplizierter. Zur Vereinfachung stellt Delphi die Funktion VarType zur Verfügung. Dem Befehl VarType muss die betreffende Variante mitgegeben werden.

case VarType(vExample) of
  varWord:     Writeln('Es ist ein Word: ', vExample);
  varSmallInt: Writeln('Es ist ein SmallInt: ', vExample);
  varString:   Writeln('Es ist ein String: ', vExample);
  varDouble:   Writeln('Es ist ein Double: ', vExample);
end;


Bei der Zuweisung von Ganzzahlen verwendet Delphi immer automatisch den kleinstmöglichen Datentyp. Im oberen Beispiel weisen wir die Zahl 666 zu. Diese hat kein Vorzeichen und ist größer als ein Byte. Da der nächstgrößere Datentyp ohne Vorzeichen Word ist, erhält die Variante den Typ varWord. Über die anderen ganzzahligen und ebenfalls passenden Datentypen, wie varInteger, lässt sich diese Variable dann nicht auswerten.

Varianten verhalten sich genauso, wie der ihnen zugrunde liegende Datentyp. Z.B. kann man mit ihnen rechnen, wenn sie einen Zahlentyp besitzen oder Zeichenketten an andere Zeichenketten anhängen. Hat die Variante einen Zahlentyp und man will diese Zahl an eine Zeichenkette anhängen, funktioniert das ebensowenig wie z.B. beim Typ Integer. Hierbei muss man erst eine Datenumwandlung mittels IntToStr (für Ganzzahlen) oder FloatToStr (für Gleitkommazahlen) durchführen. Beide Funktionen befinden sich in der Unit SysUtils, die zu diesem Zweck eingebunden sein muss. Im obigen Beispiel ist diese Umwandlung nicht notwendig, da der Wert der Variante nicht direkt an die Zeichenkette angehängt, sondern als weiterer Parameter an Writeln übergeben wird. Writeln übernimmt dann automatisch die notwendige Umwandlung.

Eine vollständige Liste der von Delphi mitgelieferten Rückgabewerte von VarType(vExample) erhalten Sie in der Delphi-Hilfe.

Probleme[Bearbeiten]

Unzulässige Operationen erzeugen bei statischen Variablen während des Kompilierens Fehler und können bereinigt werden. Bei Varianten treten jedoch erst zur Laufzeit Fehler auf, was die Fehlersuche und -bereinigung erschwert.

Varianten werden generell als unschöner Programmierstil angesehen und sollten in jedem Falle umgangen werden. Es ist immer möglich, eine andere Lösung als die Verwendung einer Varianten zu finden. Wenn Sie zum Beispiel an eine Funktion sowohl Ganzzahlen als auch Gleitkommazahlen übergeben möchten, können Sie dies durch eine Überladung der Funktion erreichen. Im Kapitel über Prozeduren und Funktionen lernen Sie später mehr darüber.


Arrow left.png Pascal: Records Inhaltsverzeichnis Pascal: Zeiger Arrow right.png