Forum: Compiler & IDEs Zahl der Elemente einer "typedef enum"-Deklaration


von Zäh-Koch (Gast)


Lesenswert?

Ich verwende folgende Deklarationen:
1
typedef struct
2
{
3
  int16_t  ActVal;
4
  int16_t  MinVal;
5
  int16_t  MaxVal;
6
} rec_values_t;
7
8
typedef enum
9
{
10
  LUMVAL,
11
  SATVAL,
12
  HUEVAL,
13
} lsh_elements_t;
14
15
rec_values_t   RECValues[3];

um bspw. so auf die einzelnen Element zugreifen zu können:
1
RECValues[LUMVAL].ActVal = INI_LUMINITY_VAL;
2
RECValues[SATVAL].MinVal = MIN_SATURATION_VAL;
3
RECValues[HUEVAL].MaxVal = MAX_HUE_VAL;

Der fixe Wert "3" in "rec_values_t RECValues[3]" dürfte aber 
gleichzeitig die uneleganteste wie auch unsicherste Lösung sein - zum 
Beispiel, wenn man bei Sourcecode-Modifikationen die Zahl der Elemente 
in "lsh_elements_t" ändert.

Aber wie oder wo kann der Compiler sauber und wasserdicht die Anzahl der 
Elemente eines "typedef enums" ermitteln? Insbesondere, sollte LUMVAL 
nicht wie per default mit 0 beginnen, sondern mit einem beliebigen Wert 
(den ich dann selbstverständlich vor der Verwendung einer 
enum-Konstanten davon subtrahieren müsste - aber das ist eine andere 
Baustelle)?

So funktioniert das leider nicht:
1
rec_values_t   RECValues[lsh_elements_t];  //(1)    
2
rec_values_t   RECValues[sizeof(lsh_elements_t)];  //(2)

(1) führt zur Fehlermeldung: "expected expression before 'sub_menu_t'"

(2) sizeof(...) liefert offensichtlich den Wert 1 anstelle von 3. 
Möglicherweise, weil die Zahl der drei Elemente dieses "typedef enums" 
noch in 1 Byte passen?

Ich hoffe jetzt, daß ich "nur zu doof bin", aber "C" dafür einen 
eleganteren Weg bietet - also nicht etwa nur Krückenlösungen wie meine 
oben, oder auch indem man im vorliegenden Beispiel dafür

 - "HUEVAL", das letzte Element der Enumeration, verwendet

 - oder auch (HUEVAL-LUMVAL)+1, falls LUMVAL nicht mit "1" beginnt

oder Ähnliches. Denn auch dann könnte man die Zahl der Enum-Konstanten 
ändern, ohne daß die Recordgröße enspreched angepasst wird.

Schon jetzt vielen Dank für jede notwendige Schärfung meiner 
C-Kenntnisse.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nein, "zu doof" bist Du nicht; enums werden in C ziemlich 
stiefmütterlich behandelt.

Die einzige Möglichkeit ist es, einen Wert im Enum als größten Wert zu 
behandeln, à la
1
typedef enum
2
{
3
  LUMVAL,
4
  SATVAL,
5
  HUEVAL,
6
  MAXVAL
7
} lsh_elements_t;

und dann den Wert dieser Konstanten (MAXVAL) als Anzahl gültiger Werte 
zu gebrauchen.

Mehr enum-Unterstützung ist in C derzeit nicht drin.

von Zäh-Koch (Gast)


Lesenswert?

Vielen Dank für die blitzschnelle Antwort - und überhaupt den ganzen 
unbezahlbaren 24/7-Service hier im Forum!

Zu den "enums": Also doch ähnlich wie befürchtet. Wär's andersrum, hätte 
ich gerne dafür den "dummen August" gespielt... ;-)

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.