Home > OS >  Process a 2D array made with different methods in the same function in C
Process a 2D array made with different methods in the same function in C

Time:07-14

I have created two matrices in C with the following code:

static allocation method

int data[NMAX][NMAX]; // define NMAX 10 is in header

dynamic allocation method

int** data = (int**) malloc(sizeof(int*) * N);
        for (int i = 0; i < N; i  ) {
            data[i] = (int*) malloc(sizeof(int) * M);
        }

now i want to insert data into them with ONE function like so:

int inputMatrix(int **data, int N, int M) { ... }

How can i make the same function declaration work for both array types? Currently it outputs

expected 'int **' but argument is of type 'int ** (*)[10]'

I have tried creating the static array like this:

        int* data[NMAX];
        for (int i = 0; i < N; i  ) {
            data[i] = (int[NMAX]) {};
        }

but this code produces a matrix with every line being the same after I input numbers into it

CodePudding user response:

The function inputMatrix will take an array whose elements are pointers to int, so you can create an array that holds pointers to each rows of statically allocated array and pass that to the function.

Construction of the pointer array can be done like this:

int data[NMAX][NMAX];
int *pdata[NMAX]; // array of pointers
for (int i = 0; i < N; i  ) {
    pdata[i] = data[i]; // the array data[i] is converted to pointers to their first elements here
}

CodePudding user response:

##EDI##

You array pointers

int arr[10][5];

int main(void)
{
    srand(time(NULL));
    fillArray(5, 10, arr);
    printArray(5, 10, arr);
}

See the implementations below https://godbolt.org/z/M6GhrEojn

Do not use arrays of pointers. Use array pointers instead. You remove one level of indirection and you can allocate and free it using one function call. As the whole array is a contignous chunk of memory it is much easier for processor yo use the cache.

void *allocateArray(size_t rows, size_t cols)
{
    int (*a)[cols] = malloc(rows * sizeof(*a));
    return a;
}

and example usage:

void fillArray(size_t cols, size_t rows, int (*arr)[cols])
{
    for(size_t row = 0; row < rows; row  )
        for(size_t col = 0; col < cols; col  )
            arr[row][col] = rand();
}

void printArray(size_t cols, size_t rows, int (*arr)[cols])
{
    for(size_t row = 0; row < rows; row  )
    {
        for(size_t col = 0; col < cols; col  )
            printf("[zu][zu]%d,\t", row, col, arr[row][col]);
        printf("\n");
    }
}


int main(void)
{
    size_t cols, rows;
    scanf("%zu,%zu", &rows, &cols);
    printf("rows:%zu, cols:%zu", rows, cols);
    int (*array)[cols] = allocateArray(rows, cols);
    srand(time(NULL));
    printf("%p\n", array);
    if(array) 
    {
        fillArray(rows, cols, array);
        printArray(rows, cols, array);
    }
    free(array);
}
  • Related