#c #struct
#c #структура
Вопрос:
Я не понимаю, почему мой код не работает
#include <stdio.h>
#include <stdlib.h>
typedef struct date{
int month, day, year;
} Date;
typedef struct person{
char name[32];
Date date;
}Person;
int main()
{
Person presidents[4];
presidents[0] = {"George Washington", {30, 4, 1789}};
presidents[1] = {"Thomas Jefferson", {4, 3, 1801}};
presidents[2] = {"Abraham Lincoln", {4, 3, 1861}};
presidents[3] = {"Theodore Roosevelt", {14, 8, 1901}};
return 0;
}
Это результат компилятора:
>||=== Build: Debug in MyProject (compiler: GNU GCC Compiler) ===|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c||In function 'main':|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|16|error: expected expression before '{' token|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|17|error: expected expression before '{' token|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|18|error: expected expression before '{' token|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|19|error: expected expression before '{' token|
>C:UsersMy pcOneDriveDocumentscMyProjectmain.c|15|warning: variable 'presidents' set but not used [-Wunused-but-set-variable]|
>||=== Build failed: 4 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
Ответ №1:
Попробуйте:
Person presidents[] = {
{"George Washington", {30, 4, 1789}},
{"Thomas Jefferson", {4, 3, 1801}},
{"Abraham Lincoln", {4, 3, 1861}},
{"Theodore Roosevelt", {14, 8, 1901}}
};
Инициализация всегда выполняется в форме
type var = init_val;
и приведенный выше код показывает, как инициализировать массив структур. Пожалуйста, обратите внимание, что вам не нужно указывать количество элементов presidents
массива, поскольку компилятор получит его из количества элементов в инициализаторе.
Комментарии:
1. @BUG вы можете использовать составные литералы (как предложил DavidRanieri), но технически это был бы набор назначений, а не инициализация. Вы не можете делать так, как делали … потому что синтаксис C запрещает это.
Ответ №2:
В качестве дополнения к ответу @RobertoCaboni, начиная с C99, вы также можете использовать составные литералы:
Person presidents[4];
presidents[0] = (Person){"George Washington", {30, 4, 1789}};
presidents[1] = (Person){"Thomas Jefferson", {4, 3, 1801}};
presidents[2] = (Person){"Abraham Lincoln", {4, 3, 1861}};
presidents[3] = (Person){"Theodore Roosevelt", {14, 8, 1901}};
Комментарии:
1. 1, хотя технически это скорее присвоение, чем инициализация. Но это правильно, поскольку я предполагаю, что ОП имел в виду вопрос о задании в целом.