Как передать многомерный массив функции в C/C++?Как передать многомерный массив функции?
Размеры массива не известны во время компиляции
Как передать многомерный массив функции в C/C++?Как передать многомерный массив функции?
Размеры массива не известны во время компиляции
Используйте вектор векторов, вы можете передать вектор.
Это неэффективно, за исключением массива jagged (где каждая строка может иметь разную длину от другой) или когда элементы являются строками и т. Д. Также, если asker ищет переменное количество измерений (которые мы еще не знаем), векторы не решат эту проблему, потому что векторы typedef'ed. – rwong
Вы можете передать указатель и размеры или использовать std::vector
. Но «реальное» решение с шаблоном:
template <size_t N, size_t M>
void foo(int (&pArray)[N][M]);
Этот шаблон функция принимает N на M массив целых чисел, по ссылке. Обратите внимание, что это шаблон функции, а не функция, поэтому вы получаете другую экземплярную функцию для каждого типа массива.
Я думаю, что это расширение GCC (или вполне современная функция C), но это может быть очень удобно:
void foo(int bar[n][m], int n, int m) {...}
Вам не нужно указывать постоянные значения для n и m во время компиляции? Вы делаете на моем C++ Builder 2010. (В вопросе dim's неизвестны при компиляции. – Tom
Вы можете передать указатель на начальное местоположение памяти вашего мульти массива размерности. вы также должны передать размер массива, т. е. предел каждого измерения.
т.е.
int var [x][y][z];
func (var, x, y, z);
функция definintion:
void func (int*, int, int, int);
Передача массива легко, твердая часть доступа массив внутри вашей функции. Как отмечалось в некоторых других ответах, вы можете объявить параметр функции как указатель, а также передать количество элементов для каждого dim массива.
#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 (а некоторые говорят, что они плохо, так или иначе)
Я просто суммируя варианты от других сообщений.
Если число измерений (п, как в N-мерном массиве) неизвестно, единственный способ заключается в использовании C++ многомерного массива класс. Существует несколько общедоступных реализаций из Boost или других библиотек. См. Martin Beckett's.
Если количество измерений известно, но размер массива является динамическим, см. Tom's ответ для доступа к элементу массива (преобразование мультииндекса в указатель элемента). Сам массив должен быть выделен с помощью malloc или new.
Если вы пишете многомерный массив, вы должны знать о Row-major-order, Column-major-order и т. Д.
А именно, если dimensios массив (Size1, Size2, Size3, ..., SizeN)
, то:
(Size1 * Size2 * Size3 * ... * SizeN)
sizeof(value_type) * numOfElements
(index1, index2, index3, ..., indexN)
, использовать
ptr[ index1 + (Size1 * index2) + (Size1 * Size2 * index3) + ... ]
Предполагая, что первым индексом массива является fastest-moving dimensionindex1 + (Size1 * index2) + (Size1 * Size2 * index3) + ... лучше написано как i1 + size1 * (i2 + size2 * (...)) ...) –
@Alexandre: Согласен. Я знаю http://en.wikipedia.org/wiki/Horner_scheme. Я просто хочу показать формулу так, чтобы ее можно было записать в цикл и т. Д. – rwong
извините, я имею в виду «математически». – rwong
Раздел 3.4 на этой странице адреса ваш вопрос:
http://www.programmersheaven.com/2/Pointers-and-Arrays-page-2
, конечно, массивы переменной длины не присутствовали в C до C99, и, насколько я знаю, они не присутствуют в C++. Кроме того, MSVC не реализует/не поддерживает C99.
Простым методом является сглаживание массива и итерация с использованием измерений.
#include <stdio.h>
void print_array(int *arr,int row,int col)
{
int i,j;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
printf("%d ",*(arr+i*col+j));
}
printf("\n");
}
}
int main()
{
int a[2][3] = {{1,0,2},{-1,3,1}};
int b[4] = {1,2,3,34};
print_array(a,2,3);
return 0;
}
Этот метод работает, но сглаживание массива может помешать оптимизации компилятора, что, в свою очередь, может привести к медленному выполнению.
@ GMan- Если массив был динамически распределен с размерами на основе пользовательского ввода, тогда размер не будет известен во время компиляции. – bta