Problème de segmentation
Fermé
Audetee1216
Messages postés
1
Date d'inscription
samedi 13 janvier 2018
Statut
Membre
Dernière intervention
13 janvier 2018
-
Modifié le 13 janv. 2018 à 22:47
[Dal] Messages postés 6203 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 janvier 2025 - 1 mars 2018 à 13:30
[Dal] Messages postés 6203 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 janvier 2025 - 1 mars 2018 à 13:30
A voir également:
- Problème de segmentation
- Erreur de segmentation c ✓ - Forum C++
- Erreur de segmentation (core dumped) ✓ - Forum C
- Erreur de segmentation ✓ - Forum Programmation
- Erreur de segmentation Core dumped ✓ - Forum C
- [C] Erreur de segmentation avec char * - Forum C
1 réponse
mamiemando
Messages postés
33540
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 février 2025
7 828
Modifié le 28 févr. 2018 à 11:55
Modifié le 28 févr. 2018 à 11:55
Bonjour,
En outre ta fonction de calcul de chemin devrait idéalement ne rien allouer. Elle devrait simplement prendre en paramètre :
Plusieurs conseils :
https://www.boost.org/doc/libs/1_41_0/libs/graph/doc/dijkstra_shortest_paths.html
Exemple :
Ensuite il y a au moins une chose qui ne va pas dans ton programme. Si l'utilisateur saisit s=0 et/ou t=0, comme tu décrémentes s, tu peux arriver en dehors de matrix.
En outre ta fonction de calcul de chemin devrait idéalement ne rien allouer. Elle devrait simplement prendre en paramètre :
- le graphe et les poids installés sur ses arcs, ou directement la matrice des poids
- le sommet source s
- le vecteur (pré-alloué) qui a chaque sommet t associe le poids du (d'un) plus court chemin de s à t
- le vecteur (pré-alloué) qui a chaque sommet t associe son (ou l'un de ses) prédécesseurs au sens des plus courts chemins de s à t
- Pour information, tu pourrais (comme boost) passer en paramètre l'algèbre de plus court chemin impliquée (dans ton cas (N, min, +) car les poids sont des entiers positifs, on prend les chemins de poids minimaux, et la longueur d'un chemin est obtenue en sommant les poids des arcs). En effet, les mathématiciens ont montré que l'algorithme de Dijkstra était valide dans tout semi anneau (par exemple ([0,1], max, x) ou (N, max, min)). Mais bon, pour le moment, oublions la généralisation de l'algorithme de Dijkstra et tenons-nous en à sa version de base.
Plusieurs conseils :
- Tant que tu débogues, hardcode le contenu de ta matrice, et commente la partie où tu saisis tout en attendant. En l'occurrence pour savoir comment déclencher ton erreur de segmentation, il faudrait nous dire quelle est ta matrice de poids, le sommet source, etc...
- Ça me paraît très compliqué comme implémentation. Voici le pseudo code que tu pourrais utiliser :
https://www.boost.org/doc/libs/1_41_0/libs/graph/doc/dijkstra_shortest_paths.html
- Indique avec des
printf
ce que l'utilisateur doit saisir (nombre de sommets, poids entre le sommet i et le sommet j, etc.) et les valeurs valides (valeurs positives, valeurs entre 0 et n, etc.) Idéalement contrôle la saisie, et utilise des poids qui garantissent que cette saisie est correcte (par exemple le nombre de sommet devrait être ununsigned int
ou unsize_t
). - Vérifie que pour chaque
malloc
, tu fais d'ici la fin du programme lefree
correspondant. Attention à les faire dans le bon ordre. Par exemple si tu désalloues ta matrice, il faut d'abord désallouer les lignes, et ensuite le tableau de lignes. - Essaye de localiser l'erreur de segmentation avec un débogueur (par exemple sous linux on utiliserait
gdb
), et le cas échéant en mettant desprintf
un peu partout dans ton code. - Aère ton code (espace autour des opérateurs =, ==, <=) et indente-le (accolades fermante sur une ligne vide et en dessous de la primitive correspondant).
Exemple :
for (i = 0; i < 10; ++i) { printf("%d\n", i); }
Ensuite il y a au moins une chose qui ne va pas dans ton programme. Si l'utilisateur saisit s=0 et/ou t=0, comme tu décrémentes s, tu peux arriver en dehors de matrix.
Modifié le 1 mars 2018 à 13:30
Oui, gdb avec le core dump produit par l'erreur de segmentation et en utilisant les fonctionnalités de backtrace :
http://www.linux-france.org/article/devl/gdb_howto.html
Sous Linux, on dispose aussi du magnifique Valgrind, pour détecter les fuites mémoire et faire d'autres choses très sympas :
https://www.valgrind.org/
https://openclassrooms.com/courses/debuguer-facilement-avec-valgrind
Dal