Как я могу передать динамический многомерный массив функции?

Как я могу передать многомерный массив функции в C/C++?

Размеры массива не известны во время компиляции

7
задан Aquarius_Girl 6 June 2018 в 05:41
поделиться

8 ответов

Передать массив просто, сложная часть - это доступ к массиву внутри вашей функции. Как отмечалось в некоторых других ответах, вы можете объявить параметр функции как указатель, а также передать количество элементов для каждого размера массива.

#define xsize 20
#define ysize 30
int array[xsize][ysize];
void fun(int* arr, int x, int y)
{
 // to access element 5,20
 int x = arr[y*5+20];
}

fun(array, xsize, ysize);

Конечно, я не учел всю задачу выделения массива (поскольку неизвестно, каким будет его размер, вы не можете использовать #defines (и некоторые говорят, что они все равно плохие)

3
ответ дан 6 December 2019 в 12:46
поделиться

Я думаю, что это расширение GCC (или довольно современная функция C), но это может быть довольно удобно:

void foo(int bar[n][m], int n, int m) {...}
1
ответ дан 6 December 2019 в 12:46
поделиться

Вы можете передать указатель и размеры или использовать std :: vector . Но «реальное» решение - с шаблоном:

template <size_t N, size_t M>
void foo(int (&pArray)[N][M]);

Этот шаблон функции принимает массив целых N на M по ссылке. Обратите внимание, что это шаблон функции, а не функция, поэтому вы получаете разные экземпляры функции для каждого типа массива.

1
ответ дан 6 December 2019 в 12:46
поделиться

Вы можете передать указатель на начальную ячейку памяти вашего многомерного массива. вы также должны передать размер массива, т.е. предел каждого измерения.

т.е.

int var [x][y][z];
func (var, x, y, z);

определение функции:

void func (int*, int, int, int);
1
ответ дан 6 December 2019 в 12:46
поделиться

Я просто обобщаю варианты из других сообщений.

Если количество измерений (N, как в N-мерном массиве) неизвестно, единственный способ - использовать класс многомерного массива C ++. Существует несколько общедоступных реализаций от Boost или других библиотек. См. Сообщение Мартина Беккета .

Если количество измерений известно, но размер массива является динамическим, см. ответ Тома о доступе к элементу массива (преобразование мультииндекса в указатель элемента). Сам массив нужно будет выделить с помощью malloc или new.

Если вы сами пишете класс многомерного массива, вам необходимо знать о Row-major-order , Column-major-order и т. Д.

А именно, если размер массива (Размер1, Размер2, Размер3, ..., РазмерN) , затем:

  • Количество элементов в массиве составляет (Размер1 * Размер2 * Размер3 * ... * РазмерN)
  • Необходимая память составляет sizeof (value_type) * numOfElements
  • Для доступа к элементу (index1, index2, index3, ..., indexN) используйте
0
ответ дан 6 December 2019 в 12:46
поделиться

Раздел 3.4 на этой странице отвечает на ваш вопрос:

http://www.programmersheaven.com/2/Pointers-and-Arrays-page-2

Конечно, переменная- Массивы length отсутствовали в C до C99 и, насколько мне известно, их нет в C ++. Кроме того, MSVC не реализует / не поддерживает C99.

0
ответ дан 6 December 2019 в 12:46
поделиться

Используйте вектор векторов, вы можете передать вектор.

1
ответ дан 6 December 2019 в 12:46
поделиться

Указатель на начало массива вместе с размерами - тогда выполнение арифметических операций с массивом в функции является наиболее распространенным решением.

Или используйте boost

9
ответ дан 6 December 2019 в 12:46
поделиться