Passer des tableaux multidimensionnels comme arguments de fonction en C

StackOverflow https://stackoverflow.com/questions/4051

  •  08-06-2019
  •  | 
  •  

Question

En C, puis-je passer un tableau multidimensionnel à une fonction comme argument unique lorsque je ne sais pas quelles seront les dimensions du tableau ?

De plus, mon tableau multidimensionnel peut contenir des types autres que des chaînes.

Était-ce utile?

La solution

Vous pouvez le faire avec n’importe quel type de données.Faites-en simplement un pointeur vers pointeur :

typedef struct {
  int myint;
  char* mystring;
} data;

data** array;

Mais n'oubliez pas que vous devez toujours mallocer la variable, et cela devient un peu complexe :

//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y<h;y++){
  //malloc the 'x' dimension
  array[y] = malloc(sizeof(data) * w);

  //iterate over the 'x' dimension
  for(x=0;x<w;x++){
    //malloc the string in the data structure
    array[y][x].mystring = malloc(50); //50 chars

    //initialize
    array[y][x].myint = 6;
    strcpy(array[y][x].mystring, "w00t");
  }
}

Le code pour libérer la structure semble similaire - n'oubliez pas d'appeler free() sur tout ce que vous avez malalloué !(De plus, dans les applications robustes, vous devez vérifier le retour de malloc().)

Supposons maintenant que vous souhaitiez transmettre cela à une fonction.Vous pouvez toujours utiliser le double pointeur, car vous souhaitez probablement effectuer des manipulations sur la structure de données, pas le pointeur vers des pointeurs de structures de données :

int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}

Appelez cette fonction avec :

printf("My int is %d.\n", whatsMyInt(array, 2, 4));

Sortir:

My int is 6.

Autres conseils

Passez un pointeur explicite vers le premier élément avec les dimensions du tableau comme paramètres distincts.Par exemple, pour gérer des tableaux 2D de taille arbitraire :

void func_2d(int *p, size_t M, size_t N)
{
  size_t i, j;
  ...
  p[i*N+j] = ...;
}

qui s'appellerait comme

...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);

Le même principe s'applique aux tableaux de dimension supérieure :

func_3d(int *p, size_t X, size_t Y, size_t Z)
{
  size_t i, j, k;
  ...
  p[i*Y*Z+j*Z+k] = ...;
  ...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);

Vous pouvez déclarer votre fonction comme :

f(int size, int data[][size]) {...}

Le compilateur effectuera alors toutes les opérations arithmétiques des pointeurs pour vous.

Notez que les dimensions doivent apparaître avant le tableau lui-même.

GNU C permet le transfert de déclaration d'argument (au cas où vous auriez vraiment besoin de transmettre des dimensions après le tableau) :

f(int size; int data[][size], int size) {...}

La première dimension, bien que vous puissiez également la passer en argument, est inutile pour le compilateur C (même pour l'opérateur sizeof, lorsqu'elle est appliquée sur un tableau passé en argument, elle sera toujours traitée comme un pointeur vers le premier élément).

int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix 
{
    return p[0][0];  
}

int main()
{
   int *u[5]; // will be a 5x5 matrix

   for(int i = 0; i < 5; i++)
       u[i] = new int[5];

   u[0][0] = 1; // initialize u[0][0] - not mandatory

   // put data in u[][]

   printf("%d", matmax(u, 0)); //call to function
   getche(); // just to see the result
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top