Programmierkurs: Delphi: Pascal: Aufzählungen

Aufzählungen

Bearbeiten

Oftmals dienen Variablen dazu, aufgrund ihres Wertes bestimmte Aktionen im Programmablauf auszulösen. Als einfachstes dient das Beispiel einer Ampel:

Ampel rot:  Anhalten
Ampel gelb: Fahrbereitschaft herstellen
Ampel grün: Losfahren

Dabei stehen die Farben der Ampel in einer logischen Reihenfolge zueinander. Ohne einen Aufzählungstyp zu verwenden, könnte man z.B. jeder Farbe eine Zahl zuweisen, wie rot=0, gelb=1, grün=2. Das macht den Programmtext jedoch am Ende schwer zu lesen und schwer zu warten, da immer auch die Bedeutung der Zahl bekannt sein muss. Alternativ könnte man entsprechend benannte Konstanten verwenden, was aber ebenfalls kein schöner Programmierstil ist. Eine weitere Möglichkeit wäre es, die Farbe als Text in einem String zu speichern. Mal abgesehen von der Größe des Programms kann dies zu Abstürzen wegen Tippfehlern führen, der Speicherbedarf erhöht sich und das Programm wird langsamer ausgeführt.

Aufzählungen mit automatischen Positionen
Bearbeiten

Da wir nun wissen, was wir nicht tun sollten, wie umgehen wir die Probleme?

In Pascal gibt es dafür so genannte Aufzählungstypen. Dabei wird ein Typ definiert, der Elemente in einer angegebenen Reihenfolge besitzt. Als „Werte“ werden dabei Bezeichner eingesetzt, die bisher noch nicht im Programm verwendet werden:

type
  TAmpel = (rot, gelb, gruen);

var
  Ampel: TAmpel;


Die Aufzählung sollte nicht direkt hinter der Variablendefinition angegeben, sondern möglichst immer als eigenständiger Typ definiert werden. Einzige Ausnahme: man verwendet in dem Programm tatsächlich nur genau diese eine Variable mit der Aufzählung.

Um nun der Ampel eine Farbe zu geben, weist man einfach den entsprechenden Bezeichner zu:

Ampel := gruen;


Da es sich bei diesem Typ, wie der Name schon sagt, um eine Aufzählung handelt, kann man die Werte inkrementieren (erhöhen) und dekrementieren (erniedrigen), sowie den Vorgänger bzw. Nachfolger bestimmen oder auch in einer case-Verzweigung auswerten. Dies ist möglich, da den Bezeichnern intern automatisch eine Position zugewiesen wird. Das erste Element hat immer die Position 0, das zweite die Position 1 usw. Man kann diese Position mit der Funktion Ord auslesen. Andersherum kann man mittels Typumwandlung aus einer Zahl wieder die Position im Aufzählungstyp ermitteln:

var
  b: Byte;
  a: TAmpel;

begin
  a := gelb;
  b := Ord(a);     // b = 1

  b := 2;
  a := TAmpel(b);  // a = gruen
end.


Aufzählungen mit definierten Positionen
Bearbeiten

Wem die Regel 0, 1, 2,... zu starr ist und wer eine andere Einteilung benötigt, kann hinter jedem Element eine Position vorgeben. Diese lässt sich auch aus den anderen Positionen errechnen. Ebenso sind mehrfach benannte Positionen möglich:

type
  TAmpel = (rot = 1, gelb = 2, gruen = 4);
  TArbeitstage = (Mo = 1, Di = 2, Mi = Mo + Di, Don = 4, Fr = Di + Mi);  // Mi = 1+2=3, Fr = 2+3=5
  TDoppelt = (Bez1 = 1, Bez2 = 2, Bez3 = 3, Bez4 = 2);  // sowohl Bez2 als auch Bez4 ergeben mit Ord = 2


In diesem Beispiel von TAmpel wurden die Positionen 0 und 3 übersprungen und nicht benannt. Das heißt, dass man diese Positionen nicht namentlich zuweisen kann. Aber sie existieren trotzdem und lassen sich zuweisen! Das ermöglicht die Typumwandlung:

a := TAmpel(3);
b := Ord(a);        // b = 3
a := TAmpel(1024);  // ebenfalls zulässig!

// ACHTUNG!
a := gelb;          // Ord(a) = 2
a := Succ(a);       // Ord(a) = 3 und nicht 4!


Inwiefern dies jedoch in einem Programm sinnvoll ist, muss jeder für sich selbst entscheiden.

Die Anzahl der möglichen Positionen, die auch nach der zuletzt benannten zugewiesen werden können, richtet sich nach ebendieser. Ist die letzte benannte Position kleiner als 256, ergibt eine Zuweisung von 256 gleich 0, da die Zählung wieder von vorne beginnt. Ebenso hat a im oberen Beispiel den Wert 0, da 1024 = 256 × 4. Ist die letzte Position 256 oder höher, können Werte bis 65535 angegeben werden usw. Auch negative Werte sind möglich, wenn entsprechende benannte Positionen definiert werden.


  Pascal: Grundlegende Datentypen Inhaltsverzeichnis Pascal: Sets