Array von Structs mit enum als index

Gast #3934210
Lesenswert?

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
enum Switchnames{
2
  SW_15,
3
  SW_26,
4
  SW_37,
5
  SW_48,
6
  };
7

8
typedef struct test {
9
  uint32_t testvar1;
10
  uint32_t testvar2;
11
}; 
12

13
struct test names[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 :)
Gast #3934215
Lesenswert?

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.
#3934299
Lesenswert?

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.
Gast #3934381
Lesenswert?

Okay, es war wirklich noch eine Warnung da der den fehlenden Ersatznamen 
bemängelte. Compiler ist der ARM / GNU C 4.7.3
1
enum Switchnames{
2
  SW_15,
3
  SW_26,
4
  SW_37,
5
  SW_48,
6
  };
7

8
typedef struct test {
9
  uint32_t testvar1;
10
  uint32_t testvar2;
11
} test_t; 
12

13
struct test names[10];
14

15
names[1].testvar1 = 1;
16
names[2].testvar2 = 2;

Wenn ich das compiliere gibt er ein Error hinter names[1] aus.
1
Error expected '=', ',', ';', 'asm' or '__attribute__' before '.' token
 Wie verweise ich auf das Structelement im Array - so scheinbar nicht. 
Geschweige denn bekomme den Array Index über enum?
Persönliche Seite #3934410
Lesenswert?

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
enum Switchnames
2
{
3
  SW_15,
4
  SW_26,
5
  SW_37,
6
  SW_48,
7
  SW_MAX
8
};
9

10
typedef struct test 
11
{
12
  uint32_t testvar1;
13
  uint32_t testvar2;
14
} test_t; 
15

16
test_t names[SW_MAX];
17

18
void bla(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.
Gast #3934412
Lesenswert?

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;
}
Gast #3934761
Lesenswert?

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.
#3935224
Lesenswert?

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.
Persönliche Seite #3935267
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren