Arrays: "braces around scalar initializer"



  • Hi Leute,
    sitze gerade an einer Praktikumsaufgabe für die Uni und bin echt am verzweifeln.
    Bei folgendem Text bekomme ich folgende Fehlermeldungen, die sich alle auf Zeile 45 beziehen.

    #include <stdio.h>
    
    typedef struct{
      
      int tag;
      char monat[10];
      int jahr;
    }DIN5008_TTMonatJJJJ;
    
    const char Wochentage[][15]=
    {
      "", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"
    };
    
    const char Angebot[][50]=
    {
      "void", "Essen I", "Essen II", "Eintopf", "Grill", "Pizza", "Pizzabeilage I", "Pizzabeilage II", "Beilagenauswahl", "Dessertauswahl"
    };
    
    typedef struct{
      int angebot_nr;
      int hauptgericht;
      char bezeichnung[100];
      char kennzeichnung[10];
      int zusatzstoffe_und_allergene[20];
      char glutenhaltiges_getreide;
      char schalenfruechte;
      int centpreise[3];
    }Mensa_Gericht;
    
    typedef struct{
    char Wochentage;
    DIN5008_TTMonatJJJJ datum;
    Mensa_Gericht essen[15];
    }wochentag;
    
    int main (void) {
    
    int matrikelnummer;
    int schweinezaehler;
    
    scanf("%i", &matrikelnummer);
    printf("%i", matrikelnummer);
    
    wochentag tagesmenue[]= {2, {8, "Januar", 2019}, {1, 1, "Turkey schnitzel, breaded,", "F",20 , 'a', 0, {130, 350, 350}}};
      
      
      
      return 0;
    }
    
    
    
    

    Projektaufgabe35.c: In function ‘main’: Projektaufgabe35.c:45:1: warning: braces around scalar initializer wochentag tagesmenue[]= {2, {8, "Januar", 2019}, {1, 1, "Turkey schnitzel, breaded,", "F",20 , 'a', 0, {130, 350, 350}}}; ^~~~~~~~~

    Projektaufgabe35.c:45:1: note: (near initialization for ‘tagesmenue[0].essen[0].zusatzstoffe_und_allergene[3]’) Projektaufgabe35.c:45:110: warning: excess elements in scalar initializer wochentag tagesmenue[]= {2, {8, "Januar", 2019}, {1, 1, "Turkey schnitzel, breaded,", "F",20 , 'a', 0, {130, 350, 350}}}; ^~~

    Projektaufgabe35.c:45:110: note: (near initialization for ‘tagesmenue[0].essen[0].zusatzstoffe_und_allergene[3]’) Projektaufgabe35.c:45:115: warning: excess elements in scalar initializer wochentag tagesmenue[]= {2, {8, "Januar", 2019}, {1, 1, "Turkey schnitzel, breaded,", "F",20 , 'a', 0, {130, 350, 350}}}; ^~~

    Die erste Fehlermeldung bedeutet doch, dass ich irgendwo geschweifte Klammern um einzelstehende Werte habe, bei denen ich die Klammern ja dann nicht brauche. Ich saß jetzt bestimmt schon 'ne halbe stunde dran und habe nicht verstanden was ich falsch mache.
    Und die beiden letzten Fehlermeldungen sagen, dass die beiden Zahlen 350 und 350 in Zeile 45 zu viel sind. Aber ich habe doch oben in der Gruppe Mensa_Gericht gesagt, dass ich 3 Integer Werte habe.

    Ich bin echt dankbar für jegliche Hilfe.



  • @tonimaier sagte in Arrays: "braces around scalar initializer":

    wochentag tagesmenue[]= {2, {8, "Januar", 2019}, {1, 1, "Turkey schnitzel, breaded,", "F",20 , 'a', 0, {130, 350, 350}}};
                                                                                           // ^^ hier ..
    

    ... willst du das Array zusatzstoffe_und_allergene mit 20 initialisieren. zusatzstoffe_und_allergene ist aber ein Aggregat und braucht deshalb geschwungene Klammern um den/die Initializer:

    wochentag tagesmenue[] = { 2, {8, "Januar", 2019}, {1, 1, "Turkey schnitzel, breaded,", "F", {20} , 'a', 0, {130, 350, 350}} };
    

    Übersichtlicher wäre es, wenn du nicht die gesamte Initialisierung in eine einzelne Zeile stecken würdest:

    wochentag tagesmenue[] = {
    	2,  // Wochentage
    	{ 8, "Januar", 2019 },  // datum
    	{  // essen
    		1,       // angebot_nr
    		1,       // hauptgericht
    		"Turkey schnitzel, breaded,",  // bezeichnung
    		"F",     // kennzeichnung
    		{ 20 },  // zusatzstoffe_und_allergene
    		'a',     // glutenhaltiges_getreide
    		0,       // schalenfruechte
    		{ 130, 350, 350 }  // centpreise
    	}
    };
    

    Gewöhn' dir bitte auch an, Code ordentlich einzurücken.



  • Das ist C, kein C++.



  • @manni66 Darüber, daß sein Code in C ist, ist sich @tonimaier offensichtlich klar. Den Beitrag mit Bitte um verschieben ins richtige Forum zur Moderation markieren hätte wohl gereicht.



  • @Swordfish
    Vielen, vielen Dank, dass du dir die Zeit genommen hast um dich in meinen unübersichtlichen Code zu fuchsen.
    Du hast mir echt massiv geholfen.



  • @tonimaier char monat[10]; ist imho eine nicht so tolle idee. ... für die Namen der Wochentage hast du doch auch ein Array? Wochentage und Angebot könnten btw beides char const *[] sein.

    Statt meiner Kommentare oben in der Initializer-List könnte man in halbwegs modernem C (ich glaube seit C99) auch Designated Initializers verwenden:

    wochentag tagesmenue[] = {
    	[0] = {
            .Wochentage = 2,
    	    .datum      = { 8, "Januar", 2019 },
    	    .essen      = {
                [0] = {
                    .angebot_nr                 = 1,
                    .hauptgericht               = 1,
                    .bezeichnung                = "Turkey schnitzel, breaded,",   
                    .kennzeichnung              = "F",
                    .zusatzstoffe_und_allergene = { 20 },
                    .glutenhaltiges_getreide    = 'a',
                    .schalenfruechte            = 0,
                    .centpreise                 = { 130, 350, 350 }
                }
            }
    	}
    };
    


  • Dieser Beitrag wurde gelöscht!


  • @Swordfish
    Die Typedefinitionen und globalen Datenstrukturen haben wir vorgegeben und wir dürfen sie auch nicht verändern.

    Ich habe nun aber eine andere Frage.
    Und zwar habe ich tagesmenue nun mehrere Gerichte hinzugefügt und ich soll am ende des Programmes ein Gericht ausgeben, welches eine Bestimmte Kennzeichnung nicht hat. Also muss ich irgendwie kontrollieren, ob die Kennzeichnung eines Gerichtes einen bestimmten Buchstaben nicht hat.

    typedef struct {
      int tag;
      char monat[10];
      int jahr;
    } DIN5008_TTMonatJJJJ;
    
    const char Wochentage[][15]=
    {
      "", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"
    };
    
    const char Angebot[][50]=
    {
      "void", "Essen I", "Essen II", "Eintopf", "Grill", "Pizza", "Pizzabeilage I", "Pizzabeilage II", "Beilagenauwahl", "Dessertauswahl"
    };
    
    typedef struct {
      int angebot_nr;
      int hauptgericht;
      char bezeichnung[100];
      char kennzeichnung[10];
      int zusatzstoffe_und_allergene[20];
      char glutenhaltiges_getreide;
      char schalenfruechte;
      int centpreise[3];
    }Mensa_Gericht;
    
    typedef struct{
      int Wochentage;
      DIN5008_TTMonatJJJJ datum;
      Mensa_Gericht essen[15];
    }wochentag;
    
    
    
    
    
    
    //#################################################################################################################################################################
    int main (void) {
      
      
    
    int matrikelnummer;
    int jahrestag;
    char status;
    int schweinezaehler;
    int preisindikator;
    int preishauptgericht;
    int preissalat;
    int gesamtpreis;
      
    scanf("%i", &matrikelnummer);
    printf("Suchen im Speiseplan, Name, %i", matrikelnummer);
      
    wochentag tagesmenue[] = {
    	2,  
    	{ 8, "Januar", 2019},  
        {
    	{  
    		1,       
    		1,       
    		"Turkey schnitzel, breaded",  
    		"S",     
    		{ 20 },  
    		'a',     
    		0,       
    		{130, 350, 350}  
    	},
      
        {
            2,
            1,
            "Curry lentils with vegetables",
            "V",
            {22},
            '0',
            0,
            
            {130, 350, 350}
         },
      
         {
            3,
            1,
            "White bean stew",
            "V",
            {11, 22},
            '0',
            0,
            
            {120, 270, 270}
         },
      
         {
            4,
            1,
            "Geschlossen",
         },
      
         {
            5,
            1,
            "Margherita pizza - select further ingredients yourself",
            "",
            {2, 3, 19, 22, 15, 20},
            'a',
            0,
            
            {305, 345, 345}
          }
    };
    
    for(schweinezaehler=0; schweinezaehler<=10; schweinezaehler++)
    {
      if(tagesmenue->essen[schweinezaehler].hauptgericht == 1 && tagesmenue->essen[schweinezaehler].kennzeichnung != "S")
      {
               preishauptgericht = tagesmenue->essen[schweinezaehler].centpreise[preisindikator];
               preissalat = tagesmenue->essen[7].centpreise[preisindikator];
               gesamtpreis = preishauptgericht + preissalat*1.5;
               printf("Ihr Gericht am %i. %s %i (ein %s) lautet: %s und kostet %i,%i Euro", 
               datumkurz.tag, 
               datumkurz.monat, 
               datumkurz.jahr,
               Wochentage[2],
               tagesmenue->essen[schweinezaehler].bezeichnung,
               gesamtpreis/100,                                          
               gesamtpreis%100);
        break;
      }
    }
    

    In Zeile 116 ist das, worum es eigentlich geht.
    Ich durchlaufe mit einer for-Schleife tagesmenue und vergleiche dabei in der if-Abfrage. Die erste Bedingung in der Abfrage ist erst mal unwichtig, die funktioniert auch soweit. Nur die zweite Bedingung will nicht so ganz.
    Ich muss die Bedindung so aufstellen, dass die kennzeichnung aus Mensa_Gericht (Zeile26) alles außer "S" sein kann .
    Ich habe es versucht hiermit zu lösen:

    tagesmenue->essen[schweinezaehler].kennzeichnung != "S"
    

    das geht aber nicht.

    Die Lösung ist bestimmt trivial, nur komme ich gerade nicht drauf...



  • Du vergleichst ein Objekt vom Typ char[10] mit einem Objekt vom Typ char*.
    Strings vergleicht man in C mittels Funktionen und nicht Operatoren. Kleiner Tipp: suche dir von str* Funktionen was Passendes.



  • @Wutz

    str Funktionen darf ich leider nicht benutzen



  • @tonimaier sagte in Arrays: "braces around scalar initializer":

    Ich habe es versucht hiermit zu lösen:

    tagesmenue->essen[schweinezaehler].kennzeichnung != "S"
    

    "S" ist ein stringliteral und damit vergleichst du praktisch kennzeichnung mit einer adresse. wenn du prüfen möchtest, ob kennzeichnung gleich dem zeichen "S" ist, musst du auf 'S' (also einfache anführungszeichen) verwenden.

    edit: allerdings musst du dazu hinter kennzeichnung noch ein [0] setzen.



  • @Wade1234

    Klapp jetzt, du warst mir echt eine Hilfe.
    Danke 🙂