Forum: Mikrocontroller und Digitale Elektronik C – struct initialisierung


von Jan (Gast)


Lesenswert?

Hallo Gemeinde,

Ich nutze den avr-gcc (WinAVR 20100110) 4.3.3
und habe Probleme beim initialisieren einer struct Variable.

Vielleicht kann mir jemand sagen was ich falsch mache.

•
1
C-Code typedef struct {
2
   uint8_t Val_a;
3
   uint8_t Val_b;
4
   uint8_t Val_c;
5
 }wochentag_t;
6
7
typedef struct {
8
   wochentag_t Tag[7];
9
   int16_t TotalNr;
10
 }woche_t;
11
12
13
int main(void){
14
15
  woche_t woche={ {0,1,2},
16
                  {0,1,2},
17
                  {0,1,2},
18
                  {0,1,2},
19
                  {0,1,2},
20
                  {0,1,2},
21
                  {0,1,2},
22
                  1000  };
23
24
C-Code

Fehlermeldungen :

||=== Build: Debug in TestProjV1 (compiler: GNU GCC Compiler for AVR) ===|

main.c|31|error: extra brace group at end of initializer|
main.c|31|error: (near initialization for 'woche')|
main.c|31|warning: excess elements in struct initializer|
main.c|31|warning: (near initialization for 'woche')|
main.c|32|error: extra brace group at end of initializer|
main.c|32|error: (near initialization for 'woche')|
main.c|32|warning: excess elements in struct initializer|
main.c|32|warning: (near initialization for 'woche')|
main.c|33|error: extra brace group at end of initializer|
main.c|33|error: (near initialization for 'woche')|
main.c|33|warning: excess elements in struct initializer|
main.c|33|warning: (near initialization for 'woche')|
main.c|34|error: extra brace group at end of initializer|
main.c|34|error: (near initialization for 'woche')|
main.c|34|warning: excess elements in struct initializer|
main.c|34|warning: (near initialization for 'woche')|
main.c|35|error: extra brace group at end of initializer|
main.c|35|error: (near initialization for 'woche')|
main.c|35|warning: excess elements in struct initializer|
main.c|35|warning: (near initialization for 'woche')|
main.c|36|warning: excess elements in struct initializer|
main.c|36|warning: (near initialization for 'woche')|
||=== Build failed: 10 error(s), 20 warning(s) (0 minute(s), 0 second(s)) ===|

Danke im Voraus.
Gruss,
Jan

von Jim M. (turboj)


Lesenswert?

Eventuell fehlt nur das

#include <stdint.h>

Und Du hast uns nicht alle Fehlermeldungen angegeben.

Ansonsten: Komplettes C-File als Anhang posten.

von Chris (Gast)


Lesenswert?

woche_t woche={   {{0,1,2},
                  {0,1,2},
                  {0,1,2},
                  {0,1,2},
                  {0,1,2},
                  {0,1,2},
                  {0,1,2}},
                  1000  };
Hast ein paar Klammern vergessen. So sollte es gehen.

Grüße
Chris

von Einer K. (Gast)


Lesenswert?

Du wirst schon die Klammern so anordnen müssen, wie du die Typen 
definiert hast.

Der Compiler besitzt keine telepatischen Fähigkeiten, und kann darum 
auch nicht wissen was du meinst.
Du musst schreiben was du meinst, dann gehorcht er.
1
   woche_t woche={
2
                    { 
3
                      {0,1,2},
4
                      {0,1,2},
5
                      {0,1,2},
6
                      {0,1,2},
7
                      {0,1,2},
8
                      {0,1,2},
9
                      {0,1,2}
10
                    },
11
                    1000  
12
                 };

(in C++ gestestet, sollte aber auch für C gelten)

von Jan (Gast)


Lesenswert?

Hallo Arduino Fanboy,

vielen danke für den Hinweis mit der fehlenden Klammer.
Ich habe lange drauf geschaut und es leider nicht gesehen.
Ich habe es getestet, jetzt funktioniert es.


Gruss,
Jan

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Oder mit designated initializers
1
#include <stdint.h>
2
3
typedef struct {
4
    uint8_t Val_a;
5
    uint8_t Val_b;
6
    uint8_t Val_c;
7
}wochentag_t;
8
9
typedef struct {
10
    wochentag_t Tag[7];
11
    int16_t TotalNr;
12
}woche_t;
13
14
15
int main(void){
16
    woche_t woche = {
17
        .Tag[0] = {0,1,2},
18
        .Tag[1] = {0,1,2},
19
        .Tag[2] = {0,1,2},
20
        .Tag[3] = {0,1,2},
21
        .Tag[4] = {0,1,2},
22
        .Tag[5] = {0,1,2},
23
        .Tag[6] = {0,1,2},
24
        .TotalNr = 1000
25
    };
26
27
    /*  ... */
28
    return 0;
29
}

von Jan (Gast)


Lesenswert?

Hallo Kaj G.

So ist es noch lesbarer.
Danke.

Gruss,
Jan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jan schrieb:
> So ist es noch lesbarer.

Beachte, dass dies erst ab C99 möglich ist. Lediglich der gcc bietet 
dies bereits als Extension zu C90 an.

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.