2013-10-02 15 views
7

Zostałem poproszony o usunięcie ostrzeżenia o niektórych kompilatorach. Byłem w stanie zagotować problem do następującego przykładu, który podrapuję się, dlaczego to nie zadziała. Chyba nie wiem jak zainicjować rzeczy w C++. Każda pomoc będzie doceniona.Problemy z inicjowaniem tablic w strukturach w tablicach w strukturach

używam g ++ tak: g ++ init_arr.cpp

Oto kod. Chcę zainicjować wszystkich ludzi na wszystkich tabel w Aisle pizzy:

// init_arr.cpp 
#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 


struct Person { 
    int id; 
    string name; 
    double money; 
}; 


struct Table { 
    Person tab[4]; 
}; 


struct Aisle { 
    Table ais[3]; 
}; 

int main() { 
    cout << "main function()" << endl; 

    Aisle pizza = 
     { 
      { // Table 0 
       { 0, "Tom", 100.0 }, 
       { 1, "Mary", 101.0 }, 
       { 2, "Jane", 103.0 }, 
       { 3, "Joe", 104.0 } 
      }, 

      { // Table 1 
       { 0, "Tom", 100.0 }, 
       { 1, "Mary", 101.0 }, 
       { 2, "Jane", 103.0 }, 
       { 3, "Joe", 104.0 } 
      }, 

      { // Table 2 
       { 0, "Tom", 100.0 }, 
       { 1, "Mary", 101.0 }, 
       { 2, "Jane", 103.0 }, 
       { 3, "Joe", 104.0 } 
      } 
     }; 

    return 0; 
} 

Myślałam powyżej będzie działać, ale pojawia się następujący błąd:

g++ init_arr.cpp -std=gnu++0x 
init_arr.cpp: In function ‘int main()’: 
init_arr.cpp:49: error: too many initializers for ‘Table [3]’ 
init_arr.cpp:49: error: too many initializers for ‘Aisle’ 
+8

+1 do tworzenia minimalny przypadek testowy. –

+1

Po prostu przegapiłeś wiele aparatów ortodontycznych. Jako pomoc w zrozumieniu rozważmy przypadek, w którym przejście miało więcej członków niż ais. Gdzie chcesz umieścić tych członków? – Tobias

+0

Dzięki za odpowiedź. – Bitdiot

Odpowiedz

6

tracisz wiele par nawiasów. Dodałem komentarze, aby wyjaśnić, który bit zaczyna się od miejsca.

Aby umieścić go w jednym zdaniu, problem jest, że tablica z trzech elementów może zostać zainicjowany z {1,2,3} natomiast struktura, która zawiera tablicę jako jej jednego członka jest dodatkowa warstwa, a zatem musi być initalized z { {1,2,3} } - w zewnętrzną warstwą jest struct, wewnętrzną warstwą jest macierz.

Aisle pizza = 
    { // Aisle init 
     { // Table ais[3] init 
     { // ais[0] init 
     { // Person tab[4] init 
      { 0, "Tom", 100.0 }, 
      { 1, "Mary", 101.0 }, 
      { 2, "Jane", 103.0 }, 
      { 3, "Joe", 104.0 } 
     } 
     }, 

     { // ais[1] init 
     { // Person tab[4] init 
      { 0, "Tom", 100.0 }, 
      { 1, "Mary", 101.0 }, 
      { 2, "Jane", 103.0 }, 
      { 3, "Joe", 104.0 } 
     } 
     }, 

     { // ais[2] init 
     { // Person tab[4] init 
      { 0, "Tom", 100.0 }, 
      { 1, "Mary", 101.0 }, 
      { 2, "Jane", 103.0 }, 
      { 3, "Joe", 104.0 } 
     } 
     } 
     } 
    }; 
+0

Dzięki. Na odpowiedź. I dzięki za wskazanie mojego nieporozumienia. Dałem ci znak wyboru! – Bitdiot

8

Podczas gdy @ us2012 pokazał, co działa i daje dobre wyjaśnienie (+1 dla niego), uważam, że nie jest on czytelny. Jest to alternatywa:

Aisle pizza = 
    { 
     Table { // Table 0 
      Person { 0, "Tom", 100.0 }, 
      Person { 1, "Mary", 101.0 }, 
      Person { 2, "Jane", 103.0 }, 
      Person { 3, "Joe", 104.0 } 
     }, 

     Table { // Table 1 
      Person { 0, "Tom", 100.0 }, 
      Person { 1, "Mary", 101.0 }, 
      Person { 2, "Jane", 103.0 }, 
      Person { 3, "Joe", 104.0 } 
     }, 

     Table { // Table 2 
      Person { 0, "Tom", 100.0 }, 
      Person { 1, "Mary", 101.0 }, 
      Person { 2, "Jane", 103.0 }, 
      Person { 3, "Joe", 104.0 } 
     } 
    }; 
+1

+1, to naprawdę jest lepsze. – us2012

+0

To jest bardzo przejrzysta odpowiedź. Dzięki za to. – Bitdiot

+0

Chciałbym również dać ci znak wyboru. Odpowiedziałem na wiele nawiasów klamrowych, ponieważ w pewnym sensie wykazał mój błąd w myśleniu o śledzeniu moich aparatów ortodontycznych. Ale jest to zdecydowanie dobra odpowiedź. Jeszcze raz dzięki. – Bitdiot

2

Każdy blok musi reprezentować obiekt. Struktura przejścia zawiera obiekt tablicy (ais). Każdy element tablicy ais zawiera strukturę tabeli. Każda struktura tabeli zawiera obiekt tablicy (tabulator). i tak dalej ...

Spróbuj tego:

Aisle pizza = 
    { // Aisle 
     { // .ais 
      { // .ais[0] 
       { // .ais[0].tab 
        { 0, "Tom", 100.0 }, // tab[0] 
        { 1, "Mary", 101.0 }, // tab[1] 
        { 2, "Jane", 103.0 }, // tab[2] 
        { 3, "Joe", 104.0 } // tab[3] 
       } 
      }, 

      { // .ais[1] 
       { // .ais[1].tab 
        { 0, "Tom", 100.0 }, // tab[0] 
        { 1, "Mary", 101.0 }, // tab[1] 
        { 2, "Jane", 103.0 }, // tab[2] 
        { 3, "Joe", 104.0 } // tab[3] 
       } 
      }, 

      { // .ais[2] 
       { // .ais[2].tab 
        { 0, "Tom", 100.0 }, // tab[0] 
        { 1, "Mary", 101.0 }, // tab[1] 
        { 2, "Jane", 103.0 }, // tab[2] 
        { 3, "Joe", 104.0 } // tab[3] 
       } 
      } 

     } 
    }; 
+0

Dzięki za odpowiedź! – Bitdiot