[C++ Initalisierung von POD Strukturen]: Ein Array von POD's initalisieren



  • Hallo zusammen,

    ich habe folgende Struktur gegeben:

    struct Foo
    {
    	int  bar1;
    	char bar2[];
    };
    

    Von dieser Struktur möchte ich ein Array anlegen und gleich bei der Deklaration auch initalisieren.

    Foo Bar[] = {
    			  { 1, {'a', 'b'} },
    			  { 2, {'c', 'd'} }
    	        };
    

    Leider bringt mir der gcc hier die Fehlermeldung:

    excess elements in aggregate initializer	main.cpp	StructArrayInitalization	line 48	C/C++ Problem
    

    Meine Vermutung ist, dass da Array

    // ...
    char bar2[];
    // ...
    

    nicht wie gezeigt initalisiert werden kann.

    Gibt es eine Möglichkeit, dass Array von Strukturen gleich bei der Deklaration zu initalisieren ohne die Arrays in der Struktur vorher anlegen zu müssen und dann über Pointer zu zuweisen?

    Das

    // ...
    char a1[] = {'a', 'b'};
    
    // Mit char* bar2 in Foo
    Foo Bar[] = {
      { 1, a1},
      { 2, a2}
      // ...
    };
    // ...
    

    möchte ich verhindern...

    Gruß
    Tobi

    P.S.
    STL Container scheiden in userer Umgebung leider aus... (Embedded Bereich)



  • hast du mal versucht dem char-Array eine fest eingestellte Größe von vornherein mitzugeben? So wie es jetzt ist kann der Compiler nicht bestimmen wie viel Platz das Array brauchen soll, entsprechend weiß er nicht wie groß sizeof(Foo) ist.

    /edit: MSVC erzählt mir zu deinem Code

    :\profile\mer02113\eigene dateien\cpptests\main.cpp(13) : warning C4200: nonstandard extension used : zero-sized array in struct/union
            Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
    

    Mit char bar2[3]; compilierts problemlos.



  • Hallo pumuckl,

    danke für die Antwort.

    Mit einer festen größe funktionierts, nur suche ich nach einer möglichkeit die größe des Arrays erst bei der deklaration des POD arrays angeben zu lassen.

    Mir würde eine Lösung mit Ellipsen einfallen, nur die würde ich ebenso gerne verhindern...



  • Tobias Gerg schrieb:

    Mit einer festen größe funktionierts, nur suche ich nach einer möglichkeit die größe des Arrays erst bei der deklaration des POD arrays angeben zu lassen.

    Simpelste Möglichkeit: template 🙂

    template <size_t N>
    struct Foo
    {
        int  bar1;
        char bar2[N];
    }; 
    
    Foo<2> Bar[] = {
                   { 1, {'a', 'b'} },
                   { 2, {'c', 'd'} }
                 };
    


  • Jupp,

    templates wären eine Möglichkeit...

    Danke...



  • @Tobias Gerg:
    Das geht überhaupt nicht, nicht nur wegen der Initialisierung.
    Dein Foo ist _ein_ Typ, hat daher auch nur _eine_ Grösse (sizeof), und diese beinhaltet die Grösse des "zero sized arrays" nicht.

    Wenn du also ein Foo-Array machen würdest, könntest du keine Werte in bar2 ablegen, weil kein Speicherplatz dafür vorhanden ist.

    Zero-sized-Arrays sind ein ganz schmutziger Trick, und können sinnvoll sowieso nur am Ende von Structs verwendet werden, für die man selbst Speicher beschafft. Und eben nicht in Arrays. Daher sieht der Standard sowas auch nicht vor.

    Verwende Zeiger stattdessen. Oder fixe Array Grössen.



  • Ich vermute dass er nicht zero-sized Arrays haben wollte sondern arrays mit automatischer Längebestimmung wie in

    char x[] = {'a', 'b', 'c', '\0'}; // => char x[4]
    


  • Naja das kann ja erst recht nicht gehen, weil _ein_ Typ eben nur _ein_ Typ ist, und in _einem_ Typ gibts halt auch nur _ein(e)_ Länge/Grösse/Layout/...



  • Danke an hustbaer,

    damit hat sich dann auch die Fehlermeldung für mich erklärt. Ich löse das ganze jetzt über templates...

    Gruß
    tobi


Anmelden zum Antworten