2016-10-31 12 views
2

Что я делаю неправильно здесь для C99:C структура в пределах структуры закодированной инициализации

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

Это дает ошибку:

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

Я желаю, чтобы иметь возможность получить доступ к данным, как имеющим структура в пределах структуры, что:

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

Я попробовал несколько combinations, и никто, кажется, работает для этого случая. Я уже делал предыдущую строчную кодированную инициализацию, прежде чем это работает, но не структура внутри структуры, как на этот раз.

Любые предложения?

+4

'шт' является символом,' 'Q" является строкой. Используйте простые кавычки. –

+3

Пожалуйста, прочтите ваши сообщения об ошибках; Я уверен, что ваш компилятор сказал бы вам, что не может преобразовать символ 'char *' в 'char', который точно скажет вам, в чем ваша проблема. –

+4

И нет необходимости бросать 1 в int, поскольку он уже относится к этому типу. – 2501

ответ

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

Это похоже на работу. Просто будьте осторожны с размещением ваших фигурных скобок, и ПОЖАЛУЙСТА, попробуйте понять, что вы печатаете. Вот как читать ответ:

  1. таблица [3] - массив. Итак, инициализатор начинается с '{' и заканчивается на '};', каждый элемент которого разделяется символом ','
  2. , каждый элемент этого массива является «структурным шахматом». Таким образом, каждый подэлемент начинается с '{' и заканчивается на '}'
  3. в каждом 'struct chess' у вас есть массив 'pos [3]'. Таким образом, еще один под-юг '{' и '}'
  4. каждый 'pos' является структурой, поэтому есть суб-под-«{» и «}»
  5. , наконец, поля находятся здесь. Use the C99 initializer list, чтобы сделать ваш код чище. И двойные кавычки в C - char *, а не char. Используйте одинарные кавычки

Советы:

  • пытаются минимизировать количество «трудных для чтения» кода. Он будет служить вам
  • Я никогда не использую вложенные структуры. При необходимости отделите их коды и создайте функцию, которая будет их инициализировать.
  • CPPReference Полезно
  • использовать хорошие переменные имя и идентификаторы для вашей структуры. Когда я читаю «pos», я думаю, что это позиция в координатах шахмат ((x, y) с информацией).
5

Попробуйте заключить символы символов в одинарные кавычки, как указано выше, и добавить дополнительные фигурные скобки, чтобы внутренние списки были списками инициализаторов.

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

Можете ли вы дать совет, почему существует двойной '{{}}' вокруг raw? –

+0

Ну, я думаю, что это, как это работает: таблицы [3] = {// список инициализации таблицы [] {// Список инициализации из STRUCT шахматы {// список инициализации из пос [] {» Q ', 1}, // init список координат } }, {{{B', 1}, {'B', 1}, {'B', 1}}}, { {'K', 1}, {'K', 1}, {'K', 1}}} }; Для получения дополнительной информации см. Следующий URL-адрес: http://en.cppreference.com/w/c/language/struct_initialization –