Passer la masortingce à la fonction, C

Après avoir regardé autour de moi, j’ai créé une fonction qui accepte une masortingce et effectue tout ce dont j’ai besoin, comme suit:

float energycalc(float J, int **m, int row, int col){ ... } 

Dans le menu principal, la taille du tableau est définie et remplie, mais je ne peux pas le transmettre à la fonction elle-même:

 int masortingx[row][col]; ... E=energycalc(J, masortingx, row, col); 

Cela entraîne un avertissement lors de la compilation

“project.c: 149: warning: passage de l’argument 2 de ‘energycalc’ du type de pointeur incompatible project.c: 53: note: attendu ‘int **’ mais l’argument est du type ‘int (*) [(long unsigned int) (col + -0x00000000000000001)] ‘

et conduit à une faute de segmentation.

Toute aide est grandement appréciée, merci.

Passer des tableaux à deux dimensions à une fonction en C est souvent déroutant pour les débutants.
La raison en est qu’ils pensent que les tableaux sont des pointeurs et qu’ils ne comprennent pas comment les tableaux se désintègrent.
Rappelez-vous toujours que lorsqu’il est passé en tant qu’argument, les tableaux sont convertis en pointeur vers son premier élément .
En appel de fonction

 E = energycalc(J, masortingx, row, col); 

masortingx est convertie en pointeur sur son premier élément qui est masortingx[0] . Cela signifie que passer masortingx est équivalent à passer &masortingx[0] . Notez que le type de &masortingx[0] est int(*)[col] (pointeur sur un tableau de col int) et qu’il est donc de masortingx . Cela suggère que le deuxième paramètre de la fonction energycalc doit être de type int(*)[col] . Remplacez la déclaration de fonction par

  float energycalc(int col, int (*m)[col], int row, float J); 

et appelez votre fonction en tant que

  E = energycalc(col, masortingx, row, J); 

La fonction doit être déclarée comme

 float energycalc( float J, int row, int col, int ( *m )[col] ); 

si votre compilateur prend en charge les tableaux de longueur variable.

Sinon si en déclaration

 int masortingx[row][col]; 

col est une constante alors la fonction peut être déclarée de la façon suivante

 float energycalc(float J, int m[][col], int row ); 

à condition que col constant soit défini avant la fonction.

Votre déclaration de fonction

 float energycalc(float J, int **m, int row, int col); 

est approprié lorsque vous avez un tableau déclaré comme

 int * masortingx[row]; 

et chaque élément du tableau est alloué dynamicment comme par exemple

 for ( int i = 0; i < row; i++ ) matrix[i] = malloc( col * sizeof( int ) ); 

Si le tableau est déclaré comme

 int masortingx[row][col]; 

puis changez la déclaration de fonction en

 float energycalc(float J, int m[][col], int row, int col){ 

Le nom d’un tableau à deux dimensions de type T ne se décompose pas en T** .

Si col est une variable locale, vous devez appeler la fonction avec le paramètre col avant masortingx . Ceci est fait pour que col soit visible dans la fonction.

Je pense que tu peux faire quelque chose comme ça en C

 float function_name(int mat_width, int mat_height, float masortingx[mat_width][mat_height]) { ... function body... } 

Un pointeur à pointeur n’est pas un tableau, il ne pointe pas non plus vers un tableau à deux dimensions. Cela n’a rien à voir avec les tableaux, point, alors oubliez simplement que vous avez déjà entendu parler de pointeur à pointeur et de tableaux ensemble.

(La confusion vient probablement des hordes d’enseignants / auteurs de programmation confus qui disent à tout le monde qu’ils doivent utiliser un pointeur à l’autre pour allouer des tableaux 2D dynamics. C’est tout simplement un mauvais conseil, car cela n’allouera pas un tableau réel dans des cellules de mémoire adjacentes, mais plutôt une table de correspondance fragmentée a explosé en morceaux sur tout le tas. Consultez cette référence pour savoir comment allouer réellement de tels tableaux.)

En supposant que votre compilateur ne soit pas complètement ancien, utilisez simplement un tableau de longueur variable (VLA), une fonctionnalité introduite dans le langage C avec la norme C99.

 #include  void print_masortingx (size_t row, size_t col, int masortingx[row][col]); int main (void) { int masortingx[2][3] = { {1,2,3}, {4,5,6} }; print_masortingx(2, 3, masortingx); return 0; } void print_masortingx (size_t row, size_t col, int masortingx[row][col]) { for(size_t r=0; r