Wmissing-braces bei mehrdimensionalem array



  • Hey

    Folgendes:

    const int SPIELFELD_HOEHE = 6;
    const int SPIELFELD_BREITE = 7;
    typedef std::array<std::array<int, SPIELFELD_BREITE>, SPIELFELD_HOEHE> feldTyp;
    
    //...
    
    feldTyp spielfeldMatrix = {{0}};
    

    Gibt mir folgende Warnung:

    Warnung: geschweifte Klammern fehlen um Initialisierung für »std::array<std::array<int, 7u>, 6u>::value_type {aka std::array<int, 7u>}« [-Wmissing-braces]|
    Warnung: geschweifte Klammern fehlen um Initialisierung für »std::array<int, 7u>::value_type [7] {aka int [7]}« [-Wmissing-braces]|
    

    Und ich krieg die einfach nicht weg. Wenn ich

    feldTyp spielfeldMatrix = {
                                   {0, 0, 0, 0, 0, 0, 0},
                                   {0, 0, 0, 0, 0, 0, 0},
                                   {0, 0, 0, 0, 0, 0, 0},
                                   {0, 0, 0, 0, 0, 0, 0},
                                   {0, 0, 0, 0, 0, 0, 0},
                                   {0, 0, 0, 0, 0, 0, 0}
                               };
    

    mache, sagt er mir, ich hätte zu viele Werte geschrieben. Passt doch aber eigentlich, 6 hoch und 7 breit?
    Was hab ich falsch verstanden 😕



  • Compilerbug.



  • Mit MSVC läuft das. 🕶
    Edit: Na ja, das zweite Beispiel leider auch nicht.
    @TE
    Wenn du alles auf 0 setzen willst, kannst du auch std::fill nehmen, bzw. globale/statischen Variablen sind hier eh automatisch null.



  • Oh wow. Dafür fallen auf einen Bug im GCC 20 in MSVC.



  • Auch gut.
    Und ich dachte schon, ich hätte da all die Jahre lang was falsch verstanden.



  • cooky451 schrieb:

    @TE
    Wenn du alles auf 0 setzen willst, kannst du auch std::fill nehmen, bzw. globale/statischen Variablen sind hier eh automatisch null.

    Also bei = {{0}} wird auch alles genullt, bei mir. Ist das jetzt nur Zufall oder was?



  • Incocnito schrieb:

    Also bei = {{0}} wird auch alles genullt, bei mir. Ist das jetzt nur Zufall oder was?

    Nein, wenn eine solche Initialisierung stattfindet, wird alles genullt.


  • Mod

    Das ist doch kein Wettbewerb, welcher Compiler weniger Fehler hat. Fakt ist, dies ist ein (mWn bekannter) Fehler im GCC, da dessen STL std::array ganz klassisch als gekapseltes Array implementiert und bei der Initialisierung die gleichen Regeln anwendet wie in klassischem C, dabei die Sonderregeln für std::array aber ignoriert. Im ersten Fall gibt dies eine unberechtigte Warnung, im zweiten compiliert legaler Code nicht. Um dem 4.6er GCC (ist das in 4.7 eigentlich behoben?) den Code trotzdem warnungs- und fehlerlos zu füttern muss man daher schreiben:

    feldTyp spielfeldMatrix = {{{{0}}}}; 
    
      feldTyp spielfeldMatrix2 = {{
          {{0, 0, 0, 0, 0, 0, 0}},
          {{0, 0, 0, 0, 0, 0, 0}},
          {{0, 0, 0, 0, 0, 0, 0}},
          {{0, 0, 0, 0, 0, 0, 0}},
          {{0, 0, 0, 0, 0, 0, 0}},
          {{0, 0, 0, 0, 0, 0, 0}}}
      };
    


  • cooky451 schrieb:

    Incocnito schrieb:

    Also bei = {{0}} wird auch alles genullt, bei mir. Ist das jetzt nur Zufall oder was?

    Nein, wenn eine solche Initialisierung stattfindet, wird alles genullt.

    Eben, das hab ich auch gedacht. Deswegen war ich wegen der Warnung so verwiirt 🤡

    SeppJ schrieb:

    ...

    Ich hab's eben mal mit 4.7 getestet, gibt ebenfalls ne Warnung.
    Danke für die Erklärung.


Anmelden zum Antworten