Обратите внимание на следующие две структуры:
typedef struct {
int num_data;
char * name_data;
int data[];
} part_t;
typedef struct {
int num_parts;
char * name_parts;
part_t parts[];
} container_t;
В идеале я мог бы инициализировать контейнер примерно так:
const container_t container = {
2,
"Name of first container",
{
{ 4, "Name of first part", { 1, 2, 3, 4 } },
{ 5, "Name of first part", { 1, 2, 3, 4, 5 } }
}
};
Мой компилятор говорит: "ошибка: слишком много инициализаторов"
struct
с гибким элементом массива — это ожидающая катастрофа индексации. - person Daniel Fischer   schedule 05.12.2012int foo[] = {1,2,3,4};
, и я определенно сталкивался с местами, где такая вещь была бы полезна, если бы это было разрешено. Я не удивлюсь, если некоторые компиляторы разрешат такую конструкцию, поскольку ясно, какой должна быть семантика для любого компилятора, который может ее обработать [выделить надлежащий объем пространства в области инициализированных данных, иметь имя структуры, представляющее lvalue в по адресу, и размер sizeof(structname) равен выделенному размеру]. Хотя эта функция была бы полезной, я не знаю, достаточно ли она полезна, чтобы оправдать ее реализацию. - person supercat   schedule 05.12.2012struct foo<N>
(заимствование нотации шаблона C++). Если реализация поддерживает VLA, я полагаю, что это можно реализовать. Но это было бы нетривиальным изменением языка. - person Daniel Fischer   schedule 05.12.2012struct foo<N> ar[12];
было бы нормально, как и массивы VLA. Но имея только один типstruct foo
независимо от длины, которую вы задаете для гибкого элемента массива, что помешает вам вставлять в массивstruct foo
с разными длинами массива? - person Daniel Fischer   schedule 05.12.2012sizeof()
для определения размера массива, т.е. можно было бы использовать те же методы, которые использовались бы при использовании инициализированного массива автоматически определяемой длины . - person supercat   schedule 05.12.2012int dim; scanf("%d", &dim); if (dim < 1) exit(EXIT_FAILURE); double arr[15][dim];
нет проблем, массив из 15 VLA типаdouble[dim]
. У меня такое чувство, что мы говорим мимо друг друга.struct foo { int bar; int baz[]; }; struct foo f1 = { 1, { 2,3,4 } }, f2 = { 2, { 5,6 } }; struct foo arr[12]; arr[0] = f1; arr[1] = f2;
позжеstruct foo member = arr[i];
, как это должно работать? - person Daniel Fischer   schedule 05.12.2012arr
завершится ошибкой. Можно сказатьstruct foo { int n; int baz[]; }; struct foo f1 = { 3, { 2,3,4 } }, f2 = { 2, { 5,6 } }; struct foo *arr[12]; arr[0]=&f1; arr[1] = &f2;
. Человек, вводящий значениеn
для каждого экземпляра, будет нести ответственность за его соответствие размеру массива. - person supercat   schedule 12.12.2013struct foo
, это совершенно не проблематично. В лучшем случае будет сложно создать массив изstruct foo
, поскольку с гибким элементом массива вы не знаете, сколько байтов занимает каждый элемент массива. - person Daniel Fischer   schedule 12.12.2013part_t parts[];
OP с гибким элементом массива вcontainer_t
. - person Daniel Fischer   schedule 12.12.2013int foo[] = {1,2,3,4};
. Мы согласны в отношении массивов FLA-содержащих структур. - person supercat   schedule 12.12.2013