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]);
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);
}
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);
...
}
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)
{
}
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);
}
#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;
}