Передача 2D-массива в функцию C ++ - PullRequest
276 голосов
/ 07 января 2012

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

Пока у меня есть это:

void myFunction(double** myArray){
     myArray[x][y] = 5;
     etc...
}

И я объявил массив в другом месте моего кода:

double anArray[10][10];

Однако, вызов myFunction(anArray) дает мне ошибку.

Я не хочу копировать массив при его передаче. Любые изменения, сделанные в myFunction, должны изменить состояние anArray. Если я правильно понимаю, я хочу передать в качестве аргумента указатель на 2D-массив. Функция также должна принимать массивы разных размеров. Так, например, [10][10] и [5][5]. Как я могу это сделать?

Ответы [ 14 ]

1 голос
/ 10 июня 2017

Одна важная вещь для передачи многомерных массивов:

  • First array dimension указывать не нужно.
  • Second(any any further)dimension должно быть указано.

1.Когда глобально доступно только второе измерение (в виде макроса или глобальной константы)

`const int N = 3;

`void print(int arr[][N], int m)
{
int i, j;
for (i = 0; i < m; i++)
  for (j = 0; j < N; j++)
    printf("%d ", arr[i][j]);
}`

int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
print(arr, 3);
return 0;
}`

2.Использование одного указателя : В этом методе мы должны типизировать 2D-массив при переходе к функции.

`void print(int *arr, int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
  for (j = 0; j < n; j++)
    printf("%d ", *((arr+i*n) + j));
 }

`int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3, n = 3;

// We can also use "print(&arr[0][0], m, n);"
print((int *)arr, m, n);
return 0;
}`
0 голосов
/ 18 июля 2019

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

void func1(int *arr, int n, int m){
    ...
    int i_j_the_element = arr[i * m + j];  // use the idiom of i * m + j for arr[i][j] 
    ...
}

void func2(){
    ...
    int arr[n][m];
    ...
    func1(&(arr[0][0]), n, m);
}
0 голосов
/ 01 июня 2019

Если вы хотите передать int a[2][3] в void func(int** pp), вам нужно выполнить следующие вспомогательные шаги.

int a[2][3];
int* p[2] = {a[0],a[1]};
int** pp = p;

func(pp);

Поскольку первая [2] может быть неявно указана, она может быть еще более упрощена как.

int a[][3];
int* p[] = {a[0],a[1]};
int** pp = p;

func(pp);
0 голосов
/ 14 октября 2015

Вы можете использовать шаблон в C ++, чтобы сделать это.Я сделал что-то вроде этого:

template<typename T, size_t col>
T process(T a[][col], size_t row) {
...
}

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

int some_mat[3][3], another_mat[4,5];
process(some_mat, 3);
process(another_mat, 4);

дважды создает экземпляр шаблона, чтобы получить 2 определения функций (одно, где col = 3, и одно, где col = 5).

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