Forum: Compiler & IDEs Array von Structs mit enum als index


von Jan (Gast)


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 :)

von DirkB (Gast)


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.

von Rolf M. (rmagnus)


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.

von Jan (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von PittyJ (Gast)


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;
}

von Jan (Gast)


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.

von Bernd K. (prof7bit)


Lesenswert?

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?

von B. S. (bestucki)


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.

von Markus F. (mfro)


Lesenswert?

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.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


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.

von Markus F. (mfro)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Sieh mal ganz genau hin.

Asche auf mein Haupt. Ich gestehe: nur den letzten Beitrag gelesen;)

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.