C enum Frage

  • C enum Frage

    In C gibt es die Enumerationen.

    enum { ZERO,ONE,TWO,THREE };

    so weit so gut.

    jetzt gibt es noch die Möglichkeit einen tag zu verwenden.

    Das sieht dann so aus:

    enum number { ZERO,ONE,TWO,THREE };

    ich verstehe nicht wofür dieser tag number gut sein soll.

    ich meine es geht doch auch ohne.

    okay ich kann mir jetzt eine Variable vom typ enum number definieren.

    enum number var;

    aber was bringt mir eine variable vom typ enum number?

    ich meine das ist doch keine structure in der ich mit einer solchen Variablen auf die individuellen Mitglieder zugreifen kann.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von MOS ()

  • Eine gemeine Falle: Der C-Standard fordert:

    1447Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type.

    und als solcher (char oder int) kann er auch Werte beinhalten, die für das enum ungültig sind. Der Programmierer hat sicherzustellen, dass das nicht passiert. Der Compiler stellt das nirgends sicher - auch nicht durch Kontrollen zur Laufzeit.
    ---
    Meine Github-Projekte: github.com/markusC64/
    1541 Ultimate II Firmware Releases: github.com/markusC64/1541ultimate2/releases
    1541 Ultimate II Update instructions: github.com/markusC64/1541ultimate2/wiki

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von markusC64 ()

  • Nochmal zur ursprünglichen Frage wozu das tag nützlich ist: es dient dazu, daß man im Gültigkeitsbereich der bereits definierten enum-Variable(n), weitere enum-Variable deklarieren kann, ohne daß man dazu die komplette Beschreibung wiederholen muß. Bei struct-tags und union-tags ist das genauso.

    Also kannst Du dann, wenn Du am Anfang in einer Funktion dir bereits die ersten enum-Variablen mit

    enum number { ZERO,ONE,TWO,THREE } wert_1, wert_2;

    definiert hast, später einfach schreiben:

    enum number wert_3;

    ohne die geschweifte Klammer+Inhalt noch mal zu wiederholen.

    ...

    enums sind zwar in C nicht 'mächtiger' als einfache int-Variable, sie können trotzdem sinnvoll sein einen Datentyp mit begrenztem Wertebereich zu definieren. Um mit K&R zu argumentieren, kann eine Debug-Hilfe durchaus auch die int-Werte wieder zurückübersetzen, wenn sie aus enums herkommen.

    Ansonsten gilt halt Selbstdisziplin: Als sinnvolle Operationen kommen bei enums eigentlich nur Zuweisungen und Vergleiche auf gleich/ungleich in Betracht. Arithmetik macht üblicherweise schon keinen Sinn mehr.

    Ich nutze enums um z.B. in meiner image-Bibliothek den Datentyp der Pixel einer Bitmap festzuhalten. Die IMAGE-struct enthält dann neben der Größenangabe (Spalten und Zeilen) einen Zeiger auf die Bitmap (in einer Union!) und mit dem enum type weiß die Bibliothek dann auch, auf welchen Zeiger zugegriffen werden soll:

    Quellcode

    1. typedef struct
    2. {
    3. SIZE cols;
    4. SIZE rows;
    5. TYPE type;
    6. union
    7. {
    8. BYTE **b;
    9. RGB **rgb;
    10. FLOAT **f;
    11. } u;
    12. } IMAGE;
    Alles anzeigen
    Und TYPE ist per typedef enum so definiert:

    typedef enum {NONE=0, BYTE_IMG=4, FLOAT_IMG=6, RGB_IMG=17} TYPE;


    ... ansonsten nutz' ich halt immer noch gerne den Klassiker typedef enum {false,true} boolean; :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mike ()