Массивы переменной длины
Даже если x
и y
были заменены константами, вы не можете инициализировать массив, используя показанные обозначения.Вам нужно будет использовать:
int fixed[3][4] = { someNr };
или подобное (возможно, дополнительные скобки; возможно, больше значений).Однако вы можете объявлять / определять массивы переменной длины (VLA), но не можете их инициализировать вообще.Таким образом, вы можете написать:
int x = 4;
int y = 5;
int someNr = 123;
int foo[x][y];
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
foo[i][j] = someNr + i * (x + 1) + j;
}
Очевидно, что вы не можете использовать x
и y
в качестве индексов без записи (или чтения) за пределы массива.На вас лежит ответственность за то, чтобы в стеке было достаточно места для значений, выбранных в качестве пределов для массивов (это не будет проблемой при 3х4; хотя это может быть и 300х400, и 3000х4000).Вы также можете использовать динамическое выделение VLA для обработки больших матриц.
Поддержка VLA обязательна в C99, необязательна в C11 и C18 и отсутствует в строгом C90.
Разреженные массивы
Если вам нужна «поддержка разреженных массивов», в C нет встроенного средства, которое бы вам помогло.Вы должны разработать (или найти) код, который будет обрабатывать это для вас.Это, безусловно, можно сделать;Программисты на Фортране часто делали это довольно часто в плохие старые времена, когда мегабайты памяти были роскошью, а MIPS означал миллионы инструкций в секунду, и люди были счастливы, когда их компьютер мог выполнять MIPS с двумя цифрами (а стандарт Fortran 90 былеще долгие годы).
Вам потребуется разработать структуру и набор функций для обработки разреженного массива.Вам, вероятно, придется решить, есть ли у вас значения в каждой строке или вы записываете данные только в несколько строк.Вам понадобится функция для присвоения значения ячейке, а другая - для извлечения значения из ячейки.Вам нужно будет подумать, каково значение, когда нет явной записи.(Мышление, вероятно, не сложно. Значение по умолчанию обычно равно нулю, но в зависимости от контекста может быть целесообразно использовать бесконечность или NaN (не число).) Вам также понадобится функция для выделения базовой структуры (будетВы указываете максимальные размеры?) и еще один, чтобы освободить его.