Comment passer tableau 2D (matrix) dans une fonction en C?

j'ai besoin pour ce faire persister des opérations sur la matrice. Est-ce à dire qu'il doit être passé par référence?

cela suffira-t-il?

void operate_on_matrix(char matrix[][20]);

37
demandé sur piperchester 2010-10-12 07:04:23

5 réponses

C n'a pas vraiment de tableaux multidimensionnels, mais il y a plusieurs façons de les simuler. La façon de transmettre ces tableaux à une fonction dépend de la méthode utilisée pour simuler les multiples dimensions:

1) utilisez un tableau de tableaux. Ceci ne peut être utilisé que si les limites de votre tableau sont entièrement déterminées au moment de la compilation, ou si votre compilateur supporte VLA est:

#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(ROWS, COLS, x);
}

2) Utilisez un tableau de pointeurs (alloués dynamiquement) vers des tableaux (alloués dynamiquement). Ceci est utilisé surtout 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) Utilisez un tableau à une dimension et fixez les indices. Ceci peut être utilisé à la fois statique (de taille fixe) et des 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);
}
69
répondu Bart van Ingen Schenau 2018-09-12 07:26:23

Je ne sais pas ce que vous voulez dire par "les données ne se perdent pas". Voici comment passer un tableau 2D normal à une fonction:

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

int main() {
  int somearr[M][N];
  ...
  myfunc(somearr);
  ...
}
9
répondu casablanca 2010-10-12 03:06:48

tableau 2D:

int sum(int array[][COLS], int rows)
{

}

tableau 3D:

int sum(int array[][B][C], int A)
{

}

4D tableau:

int sum(int array[][B][C][D], int A)
{

}

et nD array:

int sum(int ar[][B][C][D][E][F].....[N], int A)
{

}
0
répondu shinxg 2018-09-12 06:23:08

si votre compilateur ne supporte pas VLAs, vous pouvez le faire de manière simple en passant le tableau 2d comme int* avec row et col. Dans la fonction de réception, régénérez l'index du tableau 1d à partir des index du 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
répondu Rajneesh Gupta 2010-10-14 11:29:20
     #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;
    }
-3
répondu Casper Ghost 2017-04-03 17:26:22