2010-10-12 22 views

Répondre

59

C n'a pas vraiment des tableaux multidimensionnels, mais il y a plusieurs façons de les simuler. La manière de passer de telles matrices à une fonction dépend de la manière dont elles sont utilisées pour simuler les multiples dimensions:

1) Utilisez une matrice de matrices. Cela ne peut être utilisé que si vos limites du tableau sont entièrement déterminées au moment de la compilation, ou si votre compilateur prend en charge 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) Utilisez un des tableaux (allouée dynamiquement) tableau de pointeurs vers (alloués dynamiquement). Ceci est principalement utilisé lorsque les limites du tableau ne sont pas connues avant l'exécution.

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) Utiliser un tableau à une dimension et corriger les indices. Ceci peut être utilisé à la fois allouée statiquement (taille fixe) et les tableaux alloués dynamiquement:

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

Dans la première manière mentionnée ci-dessus, le code ne compilera pas. "rows" et "cols" dans les lignes 17 et 35 doivent changer pour "ROWS" et "COLS", respectivement. – KZcoding

+4

'void func_vla (int array [lignes] [cols], int lignes, int cols)' devrait être 'void func_vla (int lignes, int cols, int tableau [lignes] [cols])' –

5

Je ne sais pas ce que vous entendez par « données DonT se perdent ». Voici comment vous passez un tableau 2D normale à une fonction:

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

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

factoid Au hasard: La raison N est nécessaire parce que l'ordinateur a besoin de savoir dans quelle mesure le long d'incrémenter le pointeur pour chaque « ligne ». Vraiment, toutes les dimensions sauf la première sont nécessaires. C stocke les tableaux sous forme de blocs de mémoire, sans délimiteur. –

+0

données ne se perdent pas moyens sans utiliser malloc. Merci pour l'aide. – Shweta

+0

@ Christian Mann: C'est un bon factoid. Il m'est arrivé d'écrire une explication élaborée dessus aujourd'hui :-) http://stackoverflow.com/questions/3906777/error-defining-and-initializing-multidimensional-array/3910533#3910533 – Arun

-2

Si votre compilateur ne supporte pas Vlas, vous pouvez le faire de manière simple en passant le tableau 2d comme int * avec la ligne et col. Dans la fonction de réception, régénérez l'index de tableau 1d à partir des index de tableau 2d.

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

Ceci est étiqueté C, non C++. – Lundin