2
votes

vérifier si une matrice est symétrique et j'obtiens toujours le même résultat

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?


3 commentaires

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-vous max 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);


5 Réponses :


1
votes

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.


0 commentaires

6
votes

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 .


0 commentaires

2
votes

Modifiez votre appel

x = Symétrie (matrice_carrée [4] [4]);

à

x = Symétrie (& square_matrix [0] [0]);


3 commentaires

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?



3
votes

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.


8 commentaires

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.



1
votes

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;
}


0 commentaires