I have function like this:
void findScarf1(bool ** matrix, int m, int n, int radius, int connectivity);
and in main funct
My Following example may be helpful for you:
#include<stdio.h>
void f(int (*m)[7]){ // As Nawaz answred
printf("%d\n", m[3][3]);
}
void _f(int m[6][7]){ // As I commented to your question
printf("%d\n", m[3][3]);
}
void _f_(int m[][7]){// Second form of Nawaz's answe
printf("%d\n", m[3][3]);
}
void f_(int (*m)[6][7]){// Pointer of 2D array
printf("%d\n", (*m)[3][3]);
}
int main(){
int matrix[6][7] = {
{0, 0, 1, 1, 1, 0, 0},
{0, 0, 1, 3, 1, 0, 0},
{0, 0, 1, 4, 1, 0, 0},
{0, 0, 1, 5, 1, 0, 0},
{0, 0, 1, 6, 1, 0, 0},
{0, 0, 1, 7, 1, 0, 0}
};
f(matrix);
_f(matrix);
_f_(matrix);
f_(&matrix);
return 1;
}
question not tanged to c, but I compiled with gcc (I have not installed g++).
~$ gcc -Wall -pedantic 2d.c
~$ ./a.out
5
5
5
5
I was not intended to post an answer, but because I commented wrong to Nawaz answer so during an experiment I written this code.
Here one can find it working at codepacde
If you look at how your array is laid out in memory, and compare it how a pointer-to-pointer "matrix" is laid out, you will understand why you can't pass the matrix as a pointer to pointer.
You matrix is like this:
[ matrix[0][0] | matrix[0][1] | ... | matrix[0][6] | matrix[1][0] | matrix[1][1] | ... ]
A matrix in pointer-to-pointer is like this:
[ matrix[0] | matrix[1] | ... ] | | | v | [ matrix[1][0] | matrix[1][1] | ... ] v [ matrix[0][0] | matrix[0][1] | ... ]
You can solve this by changing the function argument:
bool (*matrix)[7]
That makes the argument matrix
a pointer to an array, which will work.
And by the way, the matrix
variable you have is not dynamic, it's fully declared and initialized by the compiler, there's nothing dynamic about it.
Technically, a 2D array is an array of 1D arrays. So it cannot convert into pointer to pointer. It can convert into pointer to array, though.
So this should work:
void findScarf1(bool (*matrix)[7], int m, int n, int radius, int connectivity);
Here bool (*matrix)[7]
declares a pointer to array of 7 bool.
Hope that helps.
You may define the function as:
void findScarf1(bool * matrix, int m, int n, int radius, int connectivity);
Or
void findScarf1(bool matrix[][7], int m, int n, int radius, int connectivity);
No matter how many dimensions an array has, it's just a block of linear memory.
When you use the first manner, you may need to do a cast when call this function:
findScarf1((bool *)marix, 6, 7, 3, 4);