2010-10-12 32 views

Respuesta

59

C no tiene realmente matrices multidimensionales, pero hay varias maneras de simular ellos. La forma de pasar dichas matrices a una función depende de la forma utilizada para simular las múltiples dimensiones:

1) Use una matriz de matrices. Esto sólo se puede utilizar si los límites de la matriz se determinan totalmente en tiempo de compilación, o si su compilador soporta VLA's:

#define ROWS 4 
#define COLS 5 

void func(int array[ROWS][COLS]) 
{ 
    int i, j; 

    for (i=0; i<ROWS; i++) 
    { 
    for (j=0; j<COLS; j++) 
    { 
     array[i][j] = i*j; 
    } 
    } 
} 

void func_vla(int rows, int cols, int array[rows][cols]) 
{ 
    int i, j; 

    for (i=0; i<rows; i++) 
    { 
    for (j=0; j<cols; j++) 
    { 
     array[i][j] = i*j; 
    } 
    } 
} 

int main() 
{ 
    int x[ROWS][COLS]; 

    func(x); 
    func_vla(x, rows, cols); 
} 

2) Utilizar un (matriz de punteros asignada dinámicamente) a (arrays) asignados dinámicamente. Esto se usa principalmente cuando los límites de la matriz no se conocen hasta el tiempo de ejecución.

void func(int** array, int rows, int cols) 
{ 
    int i, j; 

    for (i=0; i<rows; i++) 
    { 
    for (j=0; j<cols; j++) 
    { 
     array[i][j] = i*j; 
    } 
    } 
} 

int main() 
{ 
    int rows, cols, i; 
    int **x; 

    /* obtain values for rows & cols */ 

    /* allocate the array */ 
    x = malloc(rows * sizeof *x); 
    for (i=0; i<rows; i++) 
    { 
    x[i] = malloc(cols * sizeof *x[i]); 
    } 

    /* use the array */ 
    func(x, rows, cols); 

    /* deallocate the array */ 
    for (i=0; i<rows; i++) 
    { 
    free(x[i]); 
    } 
    free(x); 
} 

3) Utilice una matriz unidimensional y arregle los índices. Esto puede ser usado con tanto estática asignada (de tamaño fijo) y las matrices de asignación dinámica:

void func(int* array, int rows, int cols) 
{ 
    int i, j; 

    for (i=0; i<rows; i++) 
    { 
    for (j=0; j<cols; j++) 
    { 
     array[i*cols+j]=i*j; 
    } 
    } 
} 

int main() 
{ 
    int rows, cols; 
    int *x; 

    /* obtain values for rows & cols */ 

    /* allocate the array */ 
    x = malloc(rows * cols * sizeof *x); 

    /* use the array */ 
    func(x, rows, cols); 

    /* deallocate the array */ 
    free(x); 
} 
+0

En la primera forma mencionada anteriormente, el código no se compilará. "filas" y "cols" en las líneas 17 y 35 deben cambiar a "FILAS" y "COLAS", respectivamente. – KZcoding

+4

'void func_vla (int matriz [filas] [cols], int filas, int cols)' debe ser 'void func_vla (int filas, int cols, int matriz [filas] [cols])' –

5

No sé qué quiere decir con "datos no consiguen perdidos". He aquí cómo se pasa una matriz 2D normal a una función:

void myfunc(int arr[M][N]) { // M is optional, but N is required 
    .. 
} 

int main() { 
    int somearr[M][N]; 
    ... 
    myfunc(somearr); 
    ... 
} 
+10

factoide aleatoria: La razón se requiere N es porque el equipo tiene que saber qué tan avanzado para incrementar el puntero para cada "fila". Realmente, todas las dimensiones excepto la primera son necesarias. C almacena las matrices como fragmentos de memoria, sin delimitadores. –

+0

datos no se pierden significa sin utilizar malloc. Gracias por la ayuda. – Shweta

+0

@Christian Mann: Eso es un buen factoid. Hoy le escribí una explicación muy elaborada :-) http://stackoverflow.com/questions/3906777/error-defining-and-initializing-multidimensional-array/3910533#3910533 – Arun

-2

Si el compilador no admite VLA, puede hacerlo de forma sencilla haciendo pasar la matriz 2D como int * con la fila y col. En la función de recepción, regenere el índice de matriz 1d a partir de 2d índices de matriz.

int 
getid(int row, int x, int y) { 
      return (row*x+y); 
} 
void 
printMatrix(int*arr, int row, int col) { 
    for(int x = 0; x < row ; x++) { 
      printf("\n"); 
      for (int y = 0; y <col ; y++) { 
       printf("%d ",arr[getid(row, x,y)]); 
      } 
    }      
} 

main() 
{ 

    int arr[2][2] = {11,12,21,22}; 
    int row = 2, col = 2; 

    printMatrix((int*)arr, row, col); 

} 
-2
 #include <iostream> 
    using namespace std; 

    void printarray(int *a, int c,int r) 
    { 
     for (int i = 0; i < r; i++) 
     { 
      for (int j = 0; j < c; j++) 
      { 
       cout << "\t" << *(a + i*c + j) << "\t"; // a is a pointer refer to a 2D array 
      } 
     cout << endl << "\n\n"; 
     } 
    } 

    int main() 
    { 
     int array[4][4] = 
     {{1 ,2 ,3 ,4 }, 
      {12,13,14,5 }, 
      {11,16,15,6 }, 
      {10,9 ,8 ,7 }}; 

      printarray((int*)array,4,4); 
      // here I use print function but u can use any other useful function like 
      //setArray((int *) array,4,4); 

     return 0; 
    } 
+2

Esto tiene la etiqueta C, no C++. – Lundin

Cuestiones relacionadas