Advertencia: se esperaba ‘int **’ pero el argumento es del tipo ‘int (*) ‘

Código siguiente:

#include  void printSpiral(int **M, int row1, int row2, int col1, int col2) { if (!((row1 <= row2) && (col1 <= col2))) return; int i; for (i = col1; i <= col2; i++) printf("%d ", M[row1][i]); for (i = row1; i = col1; i--) printf("%d ",M[row2][i]); for (i = row2; i >= row1; i--) printf("%d ",M[i][col1]); printSpiral(M,row1+1,row2-2,col1+1,col2-1); } int main() { int n; scanf("%d",&n); int M[n][n]; int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) scanf("%d",&M[i][j]); printSpiral(M,0,n-1,0,n-1); return 0; } 

da la siguiente advertencia:

 spiral.c: In function 'main': spiral.c:26:3: warning: passing argument 1 of 'printSpiral' from incompatible pointer type [enabled by default] printSpiral(M,0,n-1,0,n-1);` spiral.c:3:6: note: `expected 'int **' but argument is of type 'int (*)[(sizetype)(n)]'` void printSpiral(int **M, int row1, int row2, int col1, int col2) { 

He visto esta advertencia por primera vez. Qué significa eso?

Hay dos problemas con este código. Primero, está pasando un argumento de int (*)[(sizetype)(n)] (puntero a una matriz de n enteros, este es el tipo al que su matriz 2D M decae cuando la pasa a una función) a su función, que es esperando un argumento de int ** . Siempre recuerda que las matrices no son punteros . Una posible solución es que puede cambiar el primer parámetro de su función al tipo int (*)[(sizetype)(n)] .

 void printSpiral(int (*M)[n], int row1, int row2, int col1, int col2) { 

Pero al hacer esto, el segundo problema saldrá a la luz y eso se debe a que declaró M como una matriz de longitud variable y no se conoce a la función n. Este problema se puede resolver pasando n de main a su función y, por lo tanto, cambie su definición de función a

 void printSpiral(int n, int (*M)[n], int row1, int row2, int col1, int col2) { 

El comstackdor quiere decirle que las funciones esperan un int ** , pero le proporciona un argumento de tipo int (*)[(sizetype)(n)] .

El primero es un puntero a (el primer elemento de una matriz de) int * , el segundo es un puntero a una matriz / arrays de longitud dada.

Compara lo que ambos significan en la memoria y por qué esto no puede funcionar de esta manera.

La solución sería proporcionar a la función un puntero a un elemento y al menos el número total de columnas. (Si desea que la función realice la comprobación de límites, también necesita el número de filas). Luego, debe calcular los índices manualmente.

debe saber que int a[][] es diferente de int **a , la primera a es igual a int (* a) [], que significa un puntero que apunta a una matriz; si desea indicar una matriz 2D mediante int **a , haga referencia a esto: Progtwigción en C: Inicialice una matriz 2D con los números 1, 2, 3