Segmentation Fault : bersoin d'aide - C - Programmation
Marsh Posté le 16-05-2007 à 10:15:25
Tout d'abord, comme je le disais hier, arrête le culte des parenthèses, le C c'est pas le Lisp
En plus, (*pointeur).champ est équivalent à : pointeur->champ.
Tu peux donc remplacer :
(*((*e).next)).t
par :
e->next->t
ce qui, tu l'avoueras, est un poil plus lisible.
Ensuite, comme suggéré hier par _darkalt3_, que te dis le debugger sur ce problème ?
edit : et visiblement pas seulement suggéré hier
Marsh Posté le 16-05-2007 à 10:15:53
Apprends, c'est un outil essentiel au développement.
edit : je te propose donc de venir ici poser tes questions sur l'utilisation d'un debugger afin de debugger ce code, cela te servira grandement pour la suite
Marsh Posté le 16-05-2007 à 10:17:23
Elmoricq a écrit : Apprends, c'est un outil essentiel au développement. |
il faut que j'utilise quel logiciel sous linux pour faire ça ?
Marsh Posté le 16-05-2007 à 10:18:46
De base, tu dois avoir gdb, en ligne de commande.
T'as donc la méthode masochiste consistant à l'utiliser tel quel.
Mais tu as aussi de nombreux front-end (interfaces graphiques) basés sur gdb, tu en as peut-être même un ou deux de base sur ton système, je ne connais pas les distribs Linux.
Je laisse ceux qui connaissent cet OS te conseiller en la matière, mais une fois une interface graphique installée pour gdb, tu verras, c'est simple : il faut compiler avec les options de debug (-g pour gcc), puis ouvrir le binaire avec le debugger.
Tu places ensuite des points d'arrêt, et il te suffit d'exécuter le binaire par l'intermédiaire du debugger. Cet outil arrêtera l'exécution au(x) point(s) d'arrêt que tu auras posé(s), et te montrera l'état de toutes tes variables et bien d'autres choses encore.
Marsh Posté le 16-05-2007 à 10:25:27
ReplyMarsh Posté le 16-05-2007 à 10:27:35
C'est l'outil du malin §§§
D'ailleurs là où je bosse (c'est dbx à la place de gdb mais ça change pas des masses le principe), ce genre de document ferait fuhrër, vu que je leur ai fait découvrir l'existence des front-end
Marsh Posté le 16-05-2007 à 10:28:44
Ben moi là où je bosse, quand je suis sous linux, c'est en telnet
donc au revoir les frontends
Marsh Posté le 16-05-2007 à 10:29:12
merci
ceci dit s'il yen a qui ont envie de chercher tout de meme l'erreur ca serait sympa
Marsh Posté le 16-05-2007 à 10:31:02
ReplyMarsh Posté le 16-05-2007 à 10:37:12
Soit le debugger, soit le format %p de printf(), à toi de voir
(ceci est un indice)
Marsh Posté le 16-05-2007 à 10:40:41
j'adore le C
en fait j'alloue de la mémoire pour deux pointeurs
je teste en retour c'est pas NULL -> c'est bon
mais si je demande d'afficher leur adresse je tombe tous els deux sur 0.000000
ou bien -0.0000000000
Marsh Posté le 16-05-2007 à 10:41:28
Elmoricq a écrit : Soit le debugger, soit le format %p de printf(), à toi de voir |
pas compris
le format %p de printf ?
Marsh Posté le 16-05-2007 à 10:50:04
forcément, tu cherches à afficher une adresse avec le format %f
man printf
Marsh Posté le 16-05-2007 à 11:58:50
JAI TROUVE
en fait, je modifie l'adresse du pointeur e dans la fonction mais je passe l'adresse du pointeur par valeur et non par adresse
je devais donc passer un pointeur de pointeur en argument de la fonction
classique cette connerie
Marsh Posté le 16-05-2007 à 12:03:10
Voila.
Tu as trouvé avec un debugger, ou à coup de printf() ?
Marsh Posté le 16-05-2007 à 12:48:35
ReplyMarsh Posté le 16-05-2007 à 13:50:47
ReplyMarsh Posté le 16-05-2007 à 15:35:25
Attends, si on te donne des indices c'est qu'on a vu où était le problème, hein
Marsh Posté le 01-06-2007 à 16:27:59
rebonjour
dites j'ai un probleme
lorsque je demande d'afficher l'adresse d'un pointeur, a un moment c'est ok
ensuite je fais appel a une fonction qui ne fait en aucun cas intervenir ce pointeur
puis je redemande d'afficher l'adresse du pointeur apres l'appel de la fonciton
et là il me sort n'importe quoi
est ce que cela peut etre du a une insuffisance en mémoire ?
genre ya plus de place donc il déplace tout ?
Marsh Posté le 01-06-2007 à 16:31:09
ReplyMarsh Posté le 01-06-2007 à 16:48:07
bin en fait une fois qu'il a cangé d'adresse, je peux plus accéder aux champs du pointeur sans qu'il me sort un sf
alors qu'avant le changement je pouvais tres bien y accéder
des idées ?
Marsh Posté le 01-06-2007 à 16:50:19
ReplyMarsh Posté le 01-06-2007 à 16:54:52
Code :
|
wala pour la partie du code qui merde, c'est le pointeur e4 qui merde
il me sort un segmentation fault au troisieme printf
Code :
|
wala pour la fonction
Marsh Posté le 01-06-2007 à 17:16:34
mais le hic c'est que le programme marchait tres bien tout a l'heure
j'ai juste changé les paramètres de départ et hop il s'est mis a planter !
Marsh Posté le 01-06-2007 à 17:19:50
Je re-pète: Un outil à connaitre
Tu fais tourner ton programme sous Valgrind, et il va te sortir les corruptions mémoire. Ensuite, tu rééxécutes au debugger ou avec des traces et hop, tu trouves la cause de ton pb.
Ah, et la signature de ta fonction avec 10 paramètres, elle fait peur.
Soit les paramètres peuvent être réunis dans une structure qui a un sens, soit ça sent le code spaghetti.
Marsh Posté le 01-06-2007 à 17:23:00
merci j'ai downloadé mais je sais pas l'installé
oui oui je suis un noob
Marsh Posté le 01-06-2007 à 17:27:57
> gzip -d valgrind.tar.gz
> tar xvf valgrind.tar
puis
> cd valgrind
> valgrind mon_exe
ou un truc du genre (RTFM)
Marsh Posté le 04-06-2007 à 10:52:26
Reply
Marsh Posté le 16-05-2007 à 10:12:16
j'ai déjà demandé de l'aide ces derniers jours mais je cale
je vous remercie d'avance de votre aide
je fais donc un programme en C et je tombe sur un de ces segmentation fault qui ne s'explique pas
je vous mets le code
en fait j'ai une liste chainé, construite de façon classique qui a cette structure
Les élements de la liste sont classés par t croissant
j'ai crée une fonction pour insérer un élément
Bon je commence par faire le premier element de ma liste manuellement
puis j'essaie de mettre un element e2 grace a cette fonction
e2 devant se mettre en premier, avant e dans la liste
je mets donc la commande
et voilà sauf que lors du premier printf : printf(" nouveau place en prems %f\n",(*((*e).next)).t); , à l'intérieur de la fonction insertion_element ca se passe bien alors que juste apres la sortie de la fonction j'ai droit au fameu segmentation fault
si quelqu'un a une explication je suis preneur
merci d'avance
Message édité par Profil supprimé le 16-05-2007 à 10:15:22