Anzahl der in "enum" definierten Werte

Gast #3610993
Lesenswert?

Da sich die Größe von enum während der Ausführung nicht mehr ändern 
lässt, gibt es mMn so etwas nicht.
Aber solange Du den Konstanten in enum keinen Wert zuweist würde ich 
einfach noch einen Eintrag anhängen und abfragen, oder den letzten +1.
1
enum { MO, DI, MI, Anzahl_Tage } day_t;
(Firma: Brainit GmbH) #3611851
Lesenswert?

hp-freund schrieb:
> Da sich die Größe von enum während der Ausführung nicht mehr ändern
> lässt, gibt es mMn so etwas nicht.
> Aber solange Du den Konstanten in enum keinen Wert zuweist würde ich
> einfach noch einen Eintrag anhängen und abfragen, oder den letzten +1.
>
>
1
> enum { MO, DI, MI, Anzahl_Tage } day_t;
2
>

Hmmm... das wäre mir zu riskant. weil: was stimmt jetzt wann:
1
enum { MO, DI, MI, Anzahl_Tage } day_t;
2
enum { MO = 0, DI, MI, Anzahl_Tage } day_t;
3
enum { MO = 1, DI, MI, Anzahl_Tage } day_t;
4
enum { MO = 1, MI=3, FR=5 Anzahl_Tage } day_t;
(Firma: Schweigstill IT) Persönliche Seite #3611935
Lesenswert?

Enums sind leider auch eines der halbgaren Konzepte von C. :-( Ein enum 
erzeugt leider keinen eigenen Namespace, so dass man selbst anhand des 
Namens festlegen sollte, für welchen enum ein bestimmter Wert verwendet 
wird. Und die Verwendung von enum-Werten als Bitmasken ist nur deswegen 
so verbreitet, weil es keine speziellen Bitmasken-Datentypen gibt.

Das, was manche C-Anfänger leider übersehen, ist die Tatsache, dass ein 
enum keine Menge von Symbolen darstellt, sondern nur eine mehr oder 
minder vereinfachte Sammlung von Integerwerten. Und das da die 
Erwartungen an die durch enums erzeugten Datentypen (8/16/32 Bit) 
auseinanderlaufen, sieht man auch daran, dass viele Compiler auch 
Schalter besitzen, mit denen mit die Größe der von erzeugten Variable 
einstellen kann. Das ganze ist einfach nur unglaublich fehlerträchtig, 
insbesondere bei der Arbeit mit vorkompilierten Bibliotheken.

Die Verwendung von Präprozessormakros ist leider auch nicht besser, 
sondern in vielen Fällen sogar noch schlechter.

In C++ ist man wenigstens den Weg gegangen, const-Werte auch für die 
Definition von Arrays usw. zuzulassen. Und Namespaces lassen sich auch 
zur Abgrenzung von enums verwenden. Aber erst mit C++11 ist das 
eigenständige Konstrukt "enum class" hinzugekommen.
Moderator #3611945
Lesenswert?

Michael Reinelt schrieb:
> Nur neugierdehalber: Warum täte man das wissen wollen? (die Anzahl der
> enum-werte) Mir fiele grad kein Beispiel ein...

Guter Einwand!

Ich wollte eigentlich gerade schreiben:

Manchmal möchte man ein Array definieren, das über den Enum-Typ
indiziert wird. Dann ist die erforderliche Array-Größe die Anzahl der
möglichen Enum-Werte.

Der zweite Satz ist aber falsch. Richtig muss er heißen:

Dann ist die erforderliche Größe des Arrays der größte Enum-Wert plus 1.

Dann funktioniert die Indizierung immer, insbesondere auch dann, wenn
die Enum-Werte nicht fortlaufend sind, wie in dem von Rufus geposteten
Beispiel.

Daher stellt sich auch für mich die Frage:

Wozu muss man die Anzahl der in "enum" definierten Werte wissen?
#3612575
Lesenswert?

Rufus Τ. Firefly schrieb:
> Warum wohl schrieb "hp-freund" das hier?
>
>> solange Du den Konstanten in enum keinen Wert zuweist

;-)

Klar, das ganze mach natürlich nur Sinn, wenn man eben KEINE Werte 
zuweist. Dann aber finde ich das eine elegante(*) Art, die Konstante 
"Anzahl Werte" zu definieren. Natürlich darf man hinterher nicht 
plötzlich Werte hart zu definieren. Aber die Gefahr, zu vergesssen, eine 
separat definierte Konstante nachzuführen, wenn man einen zusätzlichen 
Wert anfügt, halte ich für mindestens 236 mal grösser.


(*) naja, so elegant, wie es das Konstrukt Enum halt zulässt... ;-)
Gast #3612612
Lesenswert?

Yalu X. schrieb:
> Wozu muss man die Anzahl der in "enum" definierten Werte wissen?
1
void doSomething(day_t day)
2
{
3
    if (day >= NUMBER_OF_DAYS)
4
    {
5
        //error
6
    }
7
    else
8
    {
9
        //...doSomething
10
    }
11

12
    
13
}

Natürlich nur, wenn die Werte hinter den enum-members nicht 
interessieren, sondern rein ein symbolischer Bezeichner benutzt werden 
soll.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren