2016-10-31 4 views
2

Was ich hier falsch für C99 tue:C-Struktur innerhalb einer Struktur fest codierten Initialisierung

struct chess { 
    struct coordinate { 
     char piece; 
     int alive; 
    } pos[3]; 
}table[3] = 
{ 
    { 
     {'Q', (int)1},{'Q', (int)1},{'Q', (int)1}, 
     {'B', (int)1},{'B', (int)1},{'B', (int)1}, 
     {'K', (int)1},{'K', (int)1},{'K', (int)1}, 
    } 
}; 

Es gibt den Fehler:

error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token 

Ich möchte auf die Daten zugreifen können, wie ein mit Struktur innerhalb einer Struktur, die:

table[row].pos[column].piece 
table[row].pos[column].alive 

ich mehrere combinations versucht, und keiner scheint für diesen Fall zu arbeiten. Ich habe vorher struct hart codierte Initialisierung getan, bevor das funktioniert, aber nicht eine Struktur in einer Struktur als diese Zeit.

Irgendwelche Vorschläge?

+4

'Stück' ist ein Zeichen,' "Q" 'ist eine Zeichenfolge. Verwenden Sie einfache Anführungszeichen. –

+3

Bitte lesen Sie Ihre Fehlermeldungen; Ich bin mir ziemlich sicher, dass Ihr Compiler Ihnen gesagt hätte, dass es kein 'char *' in ein 'char' konvertieren kann, was Ihnen genau sagen würde, was Ihr Problem ist. –

+4

Und es ist nicht notwendig, 1 zu int zu werfen, da es bereits von diesem Typ ist. – 2501

Antwort

4
struct chess { 
    struct coordinate { 
     char piece; 
     int alive; 
    } pos[3]; 
} table[3] = 
{ 
    { 
     .pos = {{ .piece = 'Q', .alive = 1 }, 
       { .piece = 'Q', .alive = 1 }, 
       { .piece = 'Q', .alive = 1 } 
       } 
    }, 
    { 
     .pos = {{ .piece = 'B', .alive = 1 }, 
       { .piece = 'B', .alive = 1 }, 
       { .piece = 'B', .alive = 1 } 
       } 
    }, 
    { 
     .pos = {{ .piece = 'K', .alive = 1 }, 
       { .piece = 'K', .alive = 1 }, 
       { .piece = 'K', .alive = 1 } 
       } 
    } 
}; 

Es scheint zu funktionieren. Seien Sie vorsichtig bei der Platzierung Ihrer Zahnspange, und bitte versuchen Sie zu verstehen, was Sie tippen. So lesen Sie die Antwort:

  1. Tabelle [3] ist ein Array. Der Initialisierer beginnt also mit '{' und endet mit '};', wobei jedes Element durch ','
  2. getrennt ist. Jedes Element dieses Arrays ist ein 'struct chess'. Jedes Unterelement beginnt also mit '{' und endet mit '}'
  3. In jedem 'struct chess' haben Sie ein Array 'pos [3]'. Also ein anderes Sub-Sub '{' und '}'
  4. jeder 'pos' ist eine Struktur, so gibt es Sub-Sub-Sub '{' und '}'
  5. schließlich sind die Felder hier. Use the C99 initializer list, um Ihren Code sauberer zu machen. Und Anführungszeichen in C sind char *, nicht char. Verwenden Sie Apostrophe

Hinweise:

  • versuchen, die Menge von „schwer zu lesen“ Code zu minimieren. Es wird Ihnen dienen
  • Ich verwende nie verschachtelte Strukturen. Wenn nötig, trennen Sie ihre Codes und erstellen Sie eine Funktion, die sie initialisiert.
  • CPPReference ist nützlich
  • Verwenden Sie gute Variablen Name und Bezeichner für Ihre Struktur. Wenn ich "pos" lese, denke ich, dass es eine Position auf einem Schach ist ((x, y) Koordinaten mit Informationen).
5

Versuchen Sie, char-Literale wie oben angegeben in einfache Anführungszeichen einzuschließen, und fügen Sie zusätzliche Klammern hinzu, um innere Arrays zu Initialisierungslisten zu machen.

struct chess 
{ 
    struct coordinate 
    { 
     char piece; 
     int alive; 
    } pos[3]; 
} 
table[3] = 
{ // table of 3 struct chess instances... 
    { // ... start of a struct chess with a single member of coordinate[3]... 
     { // ... this is where the coordinate[3] array starts... 
     // ... and those are the individual elements of the coordinate[3] array 
     {'Q', 1}, {'Q', 1}, {'Q', 1} 
     } 
    }, 
    {{{'B', 1}, {'B', 1}, {'B', 1}}}, 
    {{{'K', 1}, {'K', 1}, {'K', 1}}} 
}; 
+0

Können Sie sich bitte beraten, warum gibt es doppelt '{{}}' um roh? –

+0

Nun, ich denke, das ist, wie es funktioniert: Tabelle [3] = {// init Liste der Tabelle [] {// init Liste der struct Schach {// init Liste der pos [] {‘ Q ', 1}, // Initialliste der Koordinate }, {{{B', 1}, {'B', 1}, {'B', 1}}}, {{ {'K', 1}, {'K', 1}, {'K', 1}}} }; Überprüfen Sie die folgende URL für weitere Beispiele: http://en.cppreference.com/w/c/language/struct_initialization –

Verwandte Themen