Динамическая индексация массива в C - PullRequest
0 голосов
/ 30 апреля 2019

Возможно ли создавать массивы на основе их индекса, как в

int x = 4;
int y = 5;
int someNr = 123;
int foo[x][y] = someNr;

, динамически / на ходу, без создания foo [0 ... 3] [0 ... 4]?

Если нет, то есть ли структура данных, которая позволяет мне делать что-то подобное в C?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Нет.

Как написано, ваш код вообще не имеет смысла.Вам нужно, чтобы где-то было объявлено foo, а затем вы можете индексировать его с помощью foo[x][y] = someNr;.Но вы не можете просто заставить foo появиться, что выглядит так, как будто вы пытаетесь это сделать.

Либо создайте foo с правильными размерами (только вы можете сказать, что они есть) int foo[16][16];, например, либоиспользовать другую структуру данных.В C ++ вы могли бы сделать map<pair<int, int>, int>

1 голос
/ 30 апреля 2019

Массивы переменной длины

Даже если 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 (не число).) Вам также понадобится функция для выделения базовой структуры (будетВы указываете максимальные размеры?) и еще один, чтобы освободить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...