Как я могу передать многомерный массив функции в C/C++?
Размеры массива не известны во время компиляции
Передать массив просто, сложная часть - это доступ к массиву внутри вашей функции. Как отмечалось в некоторых других ответах, вы можете объявить параметр функции как указатель, а также передать количество элементов для каждого размера массива.
#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 (и некоторые говорят, что они все равно плохие)
Я думаю, что это расширение GCC (или довольно современная функция C), но это может быть довольно удобно:
void foo(int bar[n][m], int n, int m) {...}
Вы можете передать указатель и размеры или использовать std :: vector
. Но «реальное» решение - с шаблоном:
template <size_t N, size_t M>
void foo(int (&pArray)[N][M]);
Этот шаблон функции принимает массив целых N на M по ссылке. Обратите внимание, что это шаблон функции, а не функция, поэтому вы получаете разные экземпляры функции для каждого типа массива.
Вы можете передать указатель на начальную ячейку памяти вашего многомерного массива. вы также должны передать размер массива, т.е. предел каждого измерения.
т.е.
int var [x][y][z];
func (var, x, y, z);
определение функции:
void func (int*, int, int, int);
Я просто обобщаю варианты из других сообщений.
Если количество измерений (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)
используйте
ptr [index1 + (Size1 * index2) + (Size1 * Size2 * index3) + ...]
при условии, что первый индекс массива является самым быстро движущимся измерением Раздел 3.4 на этой странице отвечает на ваш вопрос:
http://www.programmersheaven.com/2/Pointers-and-Arrays-page-2
Конечно, переменная- Массивы length отсутствовали в C до C99 и, насколько мне известно, их нет в C ++. Кроме того, MSVC не реализует / не поддерживает C99.
Используйте вектор векторов, вы можете передать вектор.
Указатель на начало массива вместе с размерами - тогда выполнение арифметических операций с массивом в функции является наиболее распространенным решением.
Или используйте boost