2011-06-12 16 views
9

Debajo del programa (un programa de juguete para pasar arreglos a una función) no se compila. Por favor, explique mí, qué es el compilador no puede compilar (ya sea por razones técnicas o por razones estándar?)Al pasar una matriz 2D en una función en el programa C

también voy a buscar en algún libro que explica punteros/matrices multidimensionales (como yo soy escéptico de estos), pero cualquier puntero comercial aquí debería ser útil.

void print2(int ** array,int n, int m); 

main() 
{ 
    int array[][4]={{1,2,3,4},{5,6,7,8}}; 
    int array2[][2]={{1,2},{3,4},{5,6},{7,8}}; 
    print2(array,2,4); 
} 

void print2(int ** array,int n,int m) 
{ 
    int i,j; 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<m;j++) 
     printf("%d ",array[i][j]); 

     printf("\n"); 
    } 
} 
+1

¿Cuál es el mensaje de error del compilador? –

Respuesta

12

Este (como es habitual) se explica en la c faq. En pocas palabras, una matriz se descompone en un puntero solo una vez (después de que se descompuso, el puntero resultante no decaerá más).

una matriz de matrices (es decir, una matriz bidimensional en C) decae en un puntero a una matriz, no un puntero a un puntero.

La manera más fácil de resolverlo:

int **array; /* and then malloc */ 
+0

http://stackoverflow.com/questions/16943909/manipulate-multidimensional-array-in-a-function – Dchris

5

En C99, como una regla simple para las funciones que reciben "matrices de longitud variable" declarar los límites primero:

void print2(int n, int m, int array[n][m]); 

y entonces su la función solo debería funcionar como es de esperar.

Edición: En general, debe echar un vistazo al orden en que se especifican las dimensiones. (y yo a :)

+0

¿Qué pasa si no quiero pasar las dimensiones de la función? – Dchris

+0

@Dchris, ¿podría aclarar más lo que quiere saber? ¿No quiere dar dimensiones en absoluto, o quiere pasar en dimensiones fijas? –

+0

Quiero pasar dimensiones fijas – Dchris

0

En su código, el puntero doble no es adecuado para acceder a una matriz 2D porque no conoce su tamaño de salto, es decir, el número de columnas. Una matriz 2D es una memoria contigua asignada.

El siguiente tipo y puntero de arreglo 2D resolvería el problema.

# define COLUMN_SIZE 4 
void print2(int ** array,int n,int m) 
{ 
    // Create a pointer to a 2D array 
    int (*ptr)[COLUMN_SIZE]; 
    ptr = int(*)[COLUMN_SIZE]array; 

    int i,j; 
    for(i = 0; i < n; i++) 
    { 
     for(j = 0; j < m; j++) 
     printf("%d ", ptr[i][j]); 
     printf("\n"); 
    } 
} 
Cuestiones relacionadas