Hallo,
Ich verzweifel gerade ob es machbar ist ein Array von Strukturen
anzulegen in dem ich als Index enum verwenden kann.
Folgende Struktur soll zum Einsatz kommen.
1
enumSwitchnames{
2
SW_15,
3
SW_26,
4
SW_37,
5
SW_48,
6
};
7
8
typedefstructtest{
9
uint32_ttestvar1;
10
uint32_ttestvar2;
11
};
12
13
structtestnames[10];
Für jeden enum möchte ich ein struct von Typ test zur verfügung haben.
Und das in einem Array. Als Arrayindex würde ich gerne die enum
verwenden.
Ich stelle mir den Zugriff z.B. so vor
1
names[SW_26].testvar2=0x0;
Geht so etwas überhaupt? Wenn ja, wie? Bislang habe ich noch nichts
gefunden und der Compiler meckert auch an meinen Versuchungen :)
Wie genau meckert der Compiler? Bitte Copy&Paste.
Welcher Compiler?
> typedef struct test {> uint32_t testvar1;> uint32_t testvar2;> };
Entweder du lässt das typedef weg oder du vergibst noch einen
(Ersatz)-Namen.
Jan schrieb:> Geht so etwas überhaupt?
Mal abgesehen von Dirks Anmerkung (die sich aber nicht auf den enum
bezieht), ja.
> Wenn ja, wie?
Genau so.
> Bislang habe ich noch nichts gefunden und der Compiler meckert auch an> meinen Versuchungen :)
Und mehr als "mecker" sagt er nicht? Normalerweie geben Compiler
hilfreichere Meldungen von sich.
Wenn das tatsächlich Dein Quelltext ist, ist der Fehler kein Wunder.
Zuweisungen können nur innerhalb von Funktionen erfolgen.
Warum verwendest Du ein typedef, wenn Du Deine Struktur dann doch mit
ihrem Strukturnamen verwendest?
Probier' mal das hier:
1
enumSwitchnames
2
{
3
SW_15,
4
SW_26,
5
SW_37,
6
SW_48,
7
SW_MAX
8
};
9
10
typedefstructtest
11
{
12
uint32_ttestvar1;
13
uint32_ttestvar2;
14
}test_t;
15
16
test_tnames[SW_MAX];
17
18
voidbla(void)
19
{
20
names[SW_15].testvar1=1;
21
names[SW_26].testvar2=2;
22
}
Und erkläre uns jetzt, warum ich Dein enum um den Wert "SW_MAX"
erweitert habe.
bei mir geht das. Die Zuweisung muss allerdings in eine Funktion:
enum Switchnames{
SW_15,
SW_26,
SW_37,
SW_48,
};
typedef struct test {
int testvar1;
int testvar2;
} test_t;
struct test names[10];
void xx()
{
names[1].testvar1 = 1;
names[2].testvar2 = 2;
}
Oh, da hab ich mich auch in was verlaufen.
Ich war die ganze Zeit außerhalb jeglicher Funktion. Vielen Dank.
Auch die enum funktioniert nun. Ja, das SW_MAX Element dient der Anzahl
an Arrayfeldern. Also Enum nummeriert von 0 bis 4 und ich brauche 4
Felder bei der Arrayinitialisierung.
Ist das nicht genau die Art von Sprachvergewaltigung die nur deshalb
funktioniert weil C nicht typsicher ist und weswegen C so oft in die
Kritik gerät?
Bernd K. schrieb:> Ist das nicht genau die Art von Sprachvergewaltigung die nur deshalb> funktioniert weil C nicht typsicher ist und weswegen C so oft in die> Kritik gerät?
Als C-Programmierer muss man halt einfach wissen, dass ein enum das
Gleiche wie ein int ist und man einer enum-Variable jeden beliebigen
Wert zuweisen kann, den man auch einem int zuweisen kann. Deshalb
versteckt man solche Dinge am besten hinter Interfaces mit Settern und
Gettern, die die enum-Veriable auf einen gültigen Wert prüfen.
Jan schrieb:> Also Enum nummeriert von 0 bis 4 und ich brauche 4> Felder
Das sind fünf ;).
Ein "off by one"-Fehler. Dafür ist C viel berühmter als für die
Typsicherheit bei enums.
Markus F. schrieb:> Ein "off by one"-Fehler. Dafür ist C viel berühmter als für die> Typsicherheit bei enums.
Sieh mal ganz genau hin. Der fünfte Wert (SW_MAX) ist genau deswegen
definiert worden.
Wenn man weiß, wie Arrays funktionieren, und wenn man weiß, was
enums sind, dann ist das eine sichere und zuverlässige Vorgehensweise,
ohne Hilfskonstrukte, ohne nachzupflegende #defines etc.