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.