J'ai écrit une fonction qui vérifie si la matrice est symétrique. Si c'est le cas, il retournera 1, sinon 0. Il renvoie toujours zéro. J'ai essayé de comprendre où se trouvait l'erreur, mais tout me semble correct.
Mon code est:
#include <stdio.h> #include <stdlib.h> #define max 100 int Symmetrie (int matrix[][max]) { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(matrix[i][j] != matrix[j][i]) { return 0; } } } return 1; } int main() { int x; int square_matrix[][max]={{1,2,3,4} ,{2,2,5,6} ,{3,5,3,7} ,{4,6,7,4} }; x= Symmetrie(square_matrix[4][4]); if(x==1) { printf("1"); } else { printf("0"); } return 0; }
La fonction doit retourner 1, mais elle renvoie zéro. Que me manque-t-il?
5 Réponses :
La déclaration ci-dessous doit être modifiée
x = Symétrie (matrice_carrée [4] [4]);
à
x = Symétrie (matrice_carrée);
square_matrix [4] [4]
est juste un élément unique aux index fournis. Passez plutôt l'adresse.
Remplacez ceci:
prog.c: In function 'main': prog.c:24:32: warning: passing argument 1 of 'Symmetrie' makes pointer from integer without a cast [-Wint-conversion] 24 | x= Symmetrie(square_matrix[4][4]); | ~~~~~~~~~~~~~~~~^~~ | | | int prog.c:5:20: note: expected 'int (*)[100]' but argument is of type 'int' 5 | int Symmetrie (int matrix[][max]) { | ~~~~^~~~~~~~~~~~~
par ceci:
x = Symmetrie(square_matrix);
car votre méthode attend la matrice entière comme paramètre, pas seulement un élément .
square_matrix [4] [4]
est un élément unique de la matrice, c'est-à-dire l'élément de la 5ème ligne et de la 5ème colonne. Bien sûr, cela invoque le Comportement indéfini (UB) , puisque votre matrice a 4 lignes.
Plus important encore, n'ignorez pas les avertissements générés. Dans GCC, par exemple, vous obtiendrez quelque chose comme ceci:
x= Symmetrie(square_matrix[4][4]);
comme vous pouvez le voir dans le Démo en direct .
Modifiez votre appel
x = Symétrie (matrice_carrée [4] [4]);
à
x = Symétrie (& square_matrix [0] [0]);
mmm pourquoi l'esperluette? je ne comprends pas passer l'adresse des éléments
Si vous n'utilisez pas l'esperluette @Amerov, alors cela serait similaire à passer square_matrix [4] [4]
, comme vous l'avez fait dans votre code, avec la seule différence de passer un élément différent. La méthode attend la matrice entière, pas seulement un élément!
@gsamaras donc si je l'écris de cette manière Symétrique (matrice carrée [4] [4]) comme paramètre ici, je ne passe qu'un seul élément, non?
Comme d'autres l'ont dit, vous devriez remplacer:
x = Symmetrie(square_matrix);
par ceci:
x = Symmetrie(square_matrix[4][4]);
Mais , je aimerais ajouter et dire que vous auriez pu le trouver très facilement par vous-même en ajoutant simplement un petit caractère.
Un simple printf ("% d =? =% d", matrice [i] [j], matrice [j] [i])
juste au-dessus du si
vous aurait montré que les nombres sont tous du charabia.
Ou , comme @DanielH l'a suggéré, certains compilateurs considèrent cela comme un avertissement et vous ne devez pas les ignorer. Pour les autres compilateurs, ajouter -Wall
comme indicateur de compilation vous aurait également aidé à comprendre cela.
Ajouter également -Wall
à la ligne de compilation (vous n'avez même pas besoin de -Wextra
ou -pedantic
, ce que je recommande également) attraperait le Erreur.
@DanielH, tnx, ajouté
@DanielH, consultez ma réponse . Il n'y a pas besoin du drapeau d'avertissement ... Bien que cela ne devrait pas faire de mal ofc;)
@gsamaras Oh, vous avez raison. J'avais déjà -Wall
sur quand j'ai compilé, et il a exposé un autre avertissement (accès au tableau hors limites), mais je ne l'ai pas essayé sans aucun avertissement.
@DanielH avec GCC 9 et -Wall
Je ne reçois pas d'avertissement de hors limites, voir le Démo en direct .
@gsamaras J'aurais dû vérifier ce que j'ai fait. Avec -O3
en plus de -Wall
, Je reçois un avertissement de GCC que l'élément 4 du tableau externe n'est pas initialisé; il semble que GCC ne voit pas cela sans optimisation. À Clang, même sans -Wall
, j'obtiens à la place l'erreur que j'ai mentionnée environ 4 étant hors limites pour le tableau interne.
Des trucs fascinants @DanielH sur le drapeau d'optimisation, j'ai eu la même chose avec O1, O2 aussi. Dans Clang, vous voulez dire que vous avez reçu l ' avertissement concernant le hors limites, pas l'erreur. :)
@gsamaras Oui, mais je n'essaie généralement pas de les distinguer car dans la plupart des cas, j'essaie d'obtenir des versions sans avertissement. Si vous compilez habituellement avec -Werror
, vous ne remarquez pas toujours quel mot le compilateur imprime avant de se plaindre de votre erreur.
Les autres réponses montrent déjà le problème, mais j'aimerais souligner qu'en utilisant la syntaxe VLA, il est possible de transmettre la taille réelle du tableau à la fonction. Il convient également de noter que les boucles peuvent être limitées à seulement la moitié de la "matrice":
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> bool is_symmetric(size_t n, int matrix[n][n]) { for(size_t i = 0; i < n; ++i) { for(size_t j = 0; j < i; ++j) { // ^^^^^ if (matrix[i][j] != matrix[j][i]) { return false; } } } return true; } int main(void) { int square_matrix[][4] = { {1,2,3,4} ,{2,2,5,6} ,{3,5,3,7} ,{4,6,7,4} }; if( is_symmetric(4, square_matrix) ) { puts("The matrix is symmetric"); } else { puts("The matrix is not symmetric"); } return 0; }
vous ne passez qu'un seul nombre square_matrix [4] [4]. Passez-le comme x = Symmetrie (square_matrix);
Cela ne devrait même pas compiler , du moins pas sans avertissements. Vous passez un
int
à la place d'un tableau, et vous accédez à un tableau hors limites. Consultez les avertissements sur godbolt.org/z/MRSJWC . Aussi, pourquoi avez-vousmax
si vous codez en dur une matrice 4x4?concernant:
x = Symmetrie (square_matrix [4] [4]);
Ceci passe un élément qu'une ligne et un élément au-delà de la fin de la matrice réelle. Suggérer:x = Symmetrie (square_matrix);