Arrays: "braces around scalar initializer"



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


  • This post is deleted!


  • @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 🙂


Log in to reply