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