Programmieren
 
 
 
 
 
C-Grundkurs

 
 
 
 
.. Aufzählungstyp - enum
 
 

 
 
 
 


In machen Programmiersituationen ist es hilfreich, wenn einer Variablen konstante Werte über einen Namen zugewiesen werden können. Ein Beispiel sind die Zahlen 0 bis 6, die bei Berechnungen des Wochentags für die Tagesnamen So, Mo .. bis Sa stehen. Durch den Präprozessorbefehl #define könnte man sich hierbei wie folgt behelfen ..


Beispiel:


#define So 0;
#define Mo 1;
#define Di 2;
#define Mi 3;
#define Do 4;
#define Fr 5;
#define Sa 6;

int tag = So;


In diesem Beispiel ist es einfacher sich die Abkürzung des Tagesnamen zu merken, als die zugeordnete Kennzahl. Allerdings muss man eine ganze Menge schreiben, und Fehler sind auch noch möglich, denn die Zuweisung ..


tag = 1234;


wäre zwar total sinnlos aber wer wollte sie verhindern? Durch den C-Aufzählungstyp enum lässt sich das Problem eleganter lösen. Hier kann man schreiben ..


Beispiel:


enum wochentag { So, Mo, Di, Mi, Do, Fr, Sa } tag;


.. und folgendes wäre passiert.
.... es wäre die Variable tag vom Typ enum wochentag entstanden ..
.... den Konstanten So, Mo .. wären die Werte 0, 1 .. zugewiesen worden.

Eine Zuweisung von tag = Mi; würden dazu führen, dass tag den Wert 4 besitzt und eine Zuweisung von tag = 1234; würde in einer Fehlermeldung enden.
Man könnte sogar weitere Konstanten vom Typ enum wochentag erzeugen, wenn man irgendwo im Quelltext folgende Zeile einfügt ..



enum wochentag feiertag, weihnachten;

feiertag = Sa;           // Wert der Variaben ist 6
weihnachten = Mo;        // Wert der Variablen ist 1


feiertag = 6; würde allerdings in einer Fehlermeldung enden, da Werte jetzt nur noch mit den konstanten Bezeichnern zugeordnet werden dürfen.






Die Meldungen im Einzelnen
Mit dem Schlüsselwort enum ist es also möglich einen neuen Variablentyp zu erzeugen, dem ein Name zugewiesen werden kann. Im Beispiel der Name wochentag. Aus diesem neuen Typ lassen sich weitere Variable ableiten. Dies kann unmittelbar hinter der Erklärung des Variablentyps erfolgen oder später im Programm.
Zwischen geschweiften Klammern werden die Namen von Konstanten genannt, denen der Compiler, wenn vom Programmierer nichts anderes verordnet wurde, automatisch die Werte 0,1,2 ... zuordnet.

Angenommen, der Programmierer möchte den Konstanten andere Werte als 0,1,2 .. zuordnen dann fügt er diese den Konstanten hinzu ..


Beispiel:


enum speicher {Disk=0x20, CD=0x40, Festpl};
enum speicher geraet;
geraet = Disk;           // zugeordneter Wert = 20h;
geraet = CD;             // zugeordneter Wert = 40h;
geraet = Festpl;         // zugeordneter Wert = 41h;


Das Beispiel zeigt, wie den Konstanten in den Klammern, vom Programmierer bestimmte Werte, verpasst werden können. Sobald der Programmierer keinen Wert angibt, zählt der Compiler mit dem Increment (Erhöhung um 1 ) selbständig weiter.

Zudem ist zu erkennen, dass in der Deklarationszeile des enum Typs nicht zwingend eine Variable angegeben werden muss. Diese wird im Beispiel erst in der zweiten Zeile deklariert.






Anmerkungen:
Wer der Beschreibung bis hierher gefolgt ist, hat den Kern des enum-Typs erfasst. Folgende Hinweise können nun noch von Interesse sein ..


  • Es ist nicht möglich, den Konstanten in den Klammern neue Werte zuzuweisen. Die Zeile Disk = 0x10; irgendwo später im Programm würde in einer Fehlermeldung enden. Aber das sagt ja eigentlich der Begriff Konstante aus.

  • Man muss dem durch enum erzeugten neuen Variablentyp keinen Namen geben. Dann allerdings müssen alle gewünschten Variablen in der Deklarationszeile abgeleitet werden ..

    enum {So, Mo, Di, Mi, Do} tag, feiertag, weihnacht;

    .. denn im Verlauf des weiteren Programmtextes kann keine weitere Variable mehr erzeugt werden.

  • Durch Benutzung der Präprozessordirektive #typedef kann der Schreibaufwand für den Variablentyp weiter vermindert werden. Durch die Zuweisung ..

    #typedef enum wochentag TAG

    können weitere Variable durch die Benutzung der Abkürzung TAG deklariert werden ..

    TAG feiertag, weihnacht;

  • Der Variablentyp der Konstanten kann nur im Wertebereich des Typs INT liegen. Der Variablentyp der enum Variablen wird vom Compiler bestimmt. Dieser ermittelt die grösste und die kleinste Konstante und weist dann der Variablen den benötigten Typ zu.


 

 
www..de