Forum: Mikrocontroller und Digitale Elektronik C – struct initialisierung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jan (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Kaj G.

So ist es noch lesbarer.
Danke.

Gruss,
Jan

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.