Как я могу передать динамический многомерный массив в функцию? - PullRequest
7 голосов
/ 01 июля 2010

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

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

Ответы [ 9 ]

9 голосов
/ 01 июля 2010

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

Или использовать boost

3 голосов
/ 01 июля 2010

Передача массива очень проста, сложная часть - доступ к массиву внутри вашей функции.Как отмечалось в некоторых других ответах, вы можете объявить параметр функции как указатель, а также передать число элементов для каждого 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 (а некоторые говорят, что они все равно плохие)

1 голос
/ 01 июля 2010

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

т.е.

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

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

void func (int*, int, int, int);
1 голос
/ 01 июля 2010

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

void foo(int bar[n][m], int n, int m) {...}
1 голос
/ 01 июля 2010

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

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

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

1 голос
/ 01 июля 2010

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

0 голосов
/ 07 октября 2010

Простой метод - выровнять массив и выполнить итерации, используя измерения.

#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;
}

Этот метод работает, но выравнивание массива может помешать оптимизации компилятора, что, в свою очередь, может привести к замедлению выполнения.

0 голосов
/ 02 июля 2010

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

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

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

0 голосов
/ 01 июля 2010

Я просто суммирую варианты из других постов.

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

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

Если вы пишете класс многомерного массива самостоятельно, вам нужно знать о мажорном ряду , мажорном столбце и т. Д.

А именно, если размер массива равен (Size1, Size2, Size3, ..., SizeN), то:

  • Количество элементов в массиве (Size1 * Size2 * Size3 * ... * SizeN)
  • Требуемая память sizeof(value_type) * numOfElements
  • Для доступа к элементу (index1, index2, index3, ..., indexN) используйте
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...