Forum: Compiler & IDEs Anzahl der in "enum" definierten Werte


von dumfbacke (Gast)


Lesenswert?

Hallo,

ich habe eine Codezeile wie z.B. diese hier:
1
enum { MO, DI, MI } day_t;

Gibt es eine Möglichkeit die Anzahl der im "enum" enthaltenen Werte zu 
erhalten? Auf einen 32-Bit System würde ich bei sizeof(day_t) den Wert 4 
anstatt 3 bekommen.

: Verschoben durch User
von hp-freund (Gast)


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;

von ben (Gast)


Lesenswert?

hp-freund schrieb:
> enum { MO, DI, MI, Anzahl_Tage } day_t;

So wird es tatsächlich, auch professionel, gemacht.
Du musst nur beim Erweitern der enum drauf achten, dass Anzahl_Tage 
immer der letzte Eintrag ist.

von Michael R. (Firma: Brainit GmbH) (fisa)


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;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael Reinelt schrieb:
> das wäre mir zu riskant. weil: was stimmt jetzt wann:

Warum wohl schrieb "hp-freund" das hier?

> solange Du den Konstanten in enum keinen Wert zuweist

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

sorry, hab ich überlesen :-(

ich halts aber trotzdem für riskant, falls man irgendwann im nachhinein 
draukommt, dass der Montag doch lieber bei eins starten sollte... die 
Stelle im Code würde also einen dicken fetten Kommentar vertragen

: Bearbeitet durch User
von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

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

von photon (Gast)


Lesenswert?

> solange Du den Konstanten in enum keinen Wert zuweist
Man muss es nur bis zum letzten Eintrag konsequent fortführen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

photon schrieb:
> Man muss es nur bis zum letzten Eintrag konsequent fortführen.

Ach?

enum Bla
{
  fusel = 1,
  laber = 2,
  suelz = 4,
  schwafel = 8,
  seier = 16
}

Und was macht man in so einem Fall? Ja: So kann man enums auch 
verwenden.

von Rolf Magnus (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Und was macht man in so einem Fall? Ja: So kann man enums auch
> verwenden.

Es gibt allerdings unterschiedliche Meinungen darüber, ob man das auch 
sollte.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


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.

von Yalu X. (yalu) (Moderator)


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?

von Simon H. (simi)


Lesenswert?

Yalu X. schrieb:
> Wozu muss man die Anzahl der in "enum" definierten Werte wissen?

Z.B. um in einer Schlaufe durch alle Werte des Enums durchzuiterieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

In einer was?

von Simon H. (simi)


Lesenswert?

Schleife meine ich natürlich :-) Das Ding mit while(..) halt. :-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ein Iterieren der Werte eines enums ist nur möglich, wenn die Werte 
keine Lücken enthalten.

Mit dem hier
1
enum Bla
2
{
3
  fusel = 1,
4
  laber = 2,
5
  suelz = 4,
6
  schwafel = 8,
7
  seier = 16
8
}
geht das beispielsweise nicht.

Denn so
1
enum Bla x = laber;
2
3
x++;

enthält x nicht "suelz", sondern 3.

von Simon H. (simi)


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... ;-)

: Bearbeitet durch User
von Haro (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.