Вы хотите это:
Third = [ [[100][010][001][111]] [[111000][000111][100100][010010][001001]]...[[111][100][010][001]] ];
Я буду исходить из того, что тип данных, который вы хотите, - bool
, но может быть любым.
Этого нельзя достичь точно в C, так как все элементы массива должны быть одного типа, и это включает его размер, когда мы говорим о массивах.
Вариант 1:
Но у нас есть, например, *argv[]
, который является массивом указателей, но поскольку указатели могут вести себя как массивы, у нас фактически есть что-то вроде этого (следуя вашей же грамматике):
*argv[] = [ [program\0][arg1\0][arg2\0] ] // Don't forget the ending NULL, but it's not relevant here.
Нечто похожее на то, что вы хотите, может быть:
void *third[n];
И при условии, что у вас есть все ваши вторые массивы, определенные как
bool second_0[4][3];
bool second_1[5][6];
...
bool second_n[4][3];
Тогда вы можете присоединиться к ним всем в third
, например:
third[0] = &second_0;
third[1] = &second_1;
...
third[n] = &second_n;
И вы можете использовать third
следующим образом: допустим, вы хотите извлечь элемент [i][j][k]
во временную переменную, и предположим, что массив second_i
имеет размеры second_i[n][m]
:
bool tmp = (*(bool (*)[n][m])third[i])[j][k];
Использование не очень приятно, но это самое близкое, что вы можете иметь к тому, что вы хотите.
Вариант 2 (предпочтительно):
У вас может быть большой массив, подобный этому: bool third[100][20][30];
, который может содержать всегда больше чисел, чем ваш самый большой ожидаемый второй массив, и просто оставить как 0 неиспользуемые значения. Он будет использовать больше памяти, но не будет нуждаться ни в приведениях, ни в указателях, а будет намного быстрее, поскольку вся память будет смежной.
Если вы используете эту опцию, вам нужна дополнительная переменная
ptrdiff_t third_sizes[ARRAY_SIZE(third)][2];
для хранения размеров каждого второго массива, чтобы вы могли отслеживать, какую часть вы использовали (с первой опцией она вам тоже понадобится). ARRAY_SIZE()
должно быть определено так:
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
Ответ на EDIT 2:
Short: нет, массивы динамического размера не существуют в C. Это невозможно.
Когда вы создаете массив и используете переменную для определения его размера, программа просто принимает значение этой переменной во время создания массива, и это будет фиксированный размер. Он не обновляет размер при обновлении переменной.
Существуют динамические решения для некоторых проблем, такие как связанные списки (Google, если вам нужно больше информации об этом), но не массивы. Другим способом достижения чего-то вроде массива массивов динамического размера было бы сочетание «варианта 1» выше с malloc()
& free()
, но я бы избегал его настолько, насколько смог, из-за производительности и из-за возможного ошибок. Некоторые говорят, что malloc()
- это зло . (Не использовать его, но использовать только тогда, когда нет альтернативы).
Тем не менее "вариант 2" выше - это то, что я выбрал бы.