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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.