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

У меня есть двумерный массив, динамически размещенный в моем C-коде, в моей функции main.Мне нужно передать этот 2D-массив в функцию.Поскольку столбцы и строки массива являются переменными времени выполнения, я знаю, что один из способов его передачи:

-Передача строк и переменных столбца и указатель на этот [0] [0] элементмассив

myfunc(&arr[0][0],rows,cols)

, затем в вызываемой функции получить доступ к нему как к «сглаженному» 1D массиву, например:

ptr[i*cols+j]

Но я не хочу делать это таким образом, потому чтоэто означало бы значительные изменения в коде, поскольку ранее массив 2D, передаваемый этой функции, был статически распределен с размерами, известными во время компиляции.

Итак, как я могу передать массив 2D в функцию ивсе еще сможете использовать его как двумерный массив с двумя индексами, подобными приведенным ниже?

arr[i][j].

Любая помощь будет оценена.

Ответы [ 7 ]

7 голосов
/ 09 августа 2010
#include <stdio.h>
#include <stdlib.h>
void doit(int ** s , int row , int col ) 
{
    for(int i =0 ; i <col;i++){
            for(int j =0 ; j <col;j++)
                printf("%d ",s[i][j]);
            printf("\n");
    }
}
int main()
{
    int row =10 , col=10;
    int ** c = (int**)malloc(sizeof(int*)*row);
    for(int i =0 ; i <col;i++)
        *(c+i) = (int*)malloc(sizeof(int)*row);
    for(int i =0 ; i <col;i++)
            for(int j =0 ; j <col;j++)
                c[i][j]=i*j;
    doit(c,row,col);
}

Надеюсь, это так, как вы хотите ....

2 голосов
/ 06 августа 2010

Если ваш компилятор поддерживает массивы переменной длины C99 (например, GCC), тогда вы можете объявить функцию следующим образом:

int foo(int cols, int rows, int a[][cols])
{
    /* ... */
}

Вы бы также использовали указатель на тип VLA в коде вызова:

int (*a)[cols] = calloc(rows, sizeof *a);
/* ... */
foo(cols, rows, a);
1 голос
/ 05 августа 2010

Насколько я знаю, все, что вы можете передать функции, это указатель на первый элемент массива.Когда вы передаете фактический массив функции, говорят, что «массив распадается на указатель», поэтому информация о размере (ях) указанного массива не сохраняется.

Ссылка наобъект типа array-of-T, который появляется в выражении, распадается (с тремя исключениями) на указатель на его первый элемент;тип результирующего указателя - указатель на T.

Полагаю, вы сможете найти больше информации об этом в C FAQ .

1 голос
/ 05 августа 2010

Вы действительно не можете сделать это без изменения большого количества кода. Я предлагаю обернуть это в структуру, которая содержит ограничения, а затем использовать regexp search'n`replace для исправления доступа.

Возможно, используйте макрос типа AA(arr,i,j) (как в Array Access), где arr - это структура.

0 голосов
/ 09 декабря 2016
int cols = 4;
    int rows = 3;
    char** charArray = new char*[rows];
    for (int i = 0; i < rows; ++i) {
        charArray[i] = new char[cols];
    }

    // Fill the array
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            charArray[i][j] = 'a';
        }
    }

    // Output the array
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            cout << charArray[i][j];
        }
        cout << endl;
    }
0 голосов
/ 08 августа 2010

2-й массив в C - это просто массив массивов.Вот и я:

void with_matrix(int **matrix, int rows, int cols) {
    int some_value = matrix[2][4];
}

int main(int argc, char **argv) {
    int **matrix;
    ... create matrix ...
    with_matrix(matrix, rows, cols);
}
0 голосов
/ 05 августа 2010

Числовые рецепты в C (книга, посвященная главным образом матрицам), предлагает способ сделать это чисто и все же иметь дело с 2D матрицами. Ознакомьтесь с разделом 1.2 «Матрицы и двумерные массивы» и методом convert_matrix () .

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

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