Segmentation Fault : bersoin d'aide

Segmentation Fault : bersoin d'aide - C - Programmation

Marsh Posté le 16-05-2007 à 10:12:16    

[:augie]

 

j'ai déjà demandé de l'aide ces derniers jours mais je cale :sweat:

 

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

 
Code :
  1. struct Element
  2. {
  3. int type;
  4. double t;
  5. struct Element * next;
  6. };
 

Les élements de la liste sont classés par t  croissant

 

j'ai crée une fonction pour insérer un élément

 
Code :
  1. void insertion_element(struct Element * e, int * taille,struct Element * e2)
  2. {
  3.   struct Element * pt, * pt2;
  4.   int i;
  5.    i = 1;
  6.    pt = e;
  7. if ( (*e2).t < (*pt).t )
  8. {
  9. e = e2;
  10. (*e).next = pt;
  11. printf(" nouveau place en prems %f\n",(*((*e).next)).t);
  12. }
  13. else
  14. {
  15. printf(" nouveau placé en dernier\n" );
  16. while( (((*e2).t) > (*pt).t) && (i< (*taille)) )
  17. {
  18.  
  19.   i = i+1;
  20.   pt2 = pt;
  21.   pt = (*pt).next;
  22.  
  23.   }
  24. if( i != (*taille))
  25. {
  26. (*pt2).next = e2;
  27. (*e2).next = pt;
  28. }
  29. else if (i == (*taille))
  30. {
  31.   (*pt).next = e2;
  32. }
  33. }
  34. (*taille) = (*taille) + 1;
  35. printf("fin insertion\n" );
  36. }
 

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

 
Code :
  1. insertion_element(e,taille,e2);
  2. printf(" nouveau place en prems %f\n",(*((*e).next)).t);
 

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 [:autobot]

 

merci d'avance :/


Message édité par Profil supprimé le 16-05-2007 à 10:15:22
Reply

Marsh Posté le 16-05-2007 à 10:12:16   

Reply

Marsh Posté le 16-05-2007 à 10:13:54    

t'as passé le debugger ?


---------------
Töp of the plöp
Reply

Marsh Posté le 16-05-2007 à 10:14:30    

non et je sais pas m'en servir :/

Reply

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 [:dawa]
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 ? [:dawa]

 

edit : et visiblement pas seulement suggéré hier [:god]


Message édité par Elmoricq le 16-05-2007 à 10:16:08
Reply

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

Message cité 1 fois
Message édité par Elmoricq le 16-05-2007 à 10:17:36
Reply

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 ?

Reply

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.


Message édité par Elmoricq le 16-05-2007 à 10:21:20
Reply

Marsh Posté le 16-05-2007 à 10:25:27    

Reply

Marsh 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 [:god]

Reply

Marsh Posté le 16-05-2007 à 10:28:44    

Ben moi là où je bosse, quand je suis sous linux, c'est en telnet :sweat:
donc au revoir les frontends :sweat:


---------------
Töp of the plöp
Reply

Marsh Posté le 16-05-2007 à 10:28:44   

Reply

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 :D

Reply

Marsh Posté le 16-05-2007 à 10:31:02    

_darkalt3_ a écrit :

Ben moi là où je bosse, quand je suis sous linux, c'est en telnet :sweat:


 
[:pingouino][:pingouino][:pingouino]
[:pingouino] [:rofl2][:pingouino]
[:pingouino][:pingouino][:pingouino]

Reply

Marsh Posté le 16-05-2007 à 10:32:15    

ouais [:roane]
spa drole en fait [:roane]


---------------
Töp of the plöp
Reply

Marsh Posté le 16-05-2007 à 10:37:12    


 
Soit le debugger, soit le format %p de printf(), à toi de voir [:arcueid brunestud]
(ceci est un indice)

Reply

Marsh Posté le 16-05-2007 à 10:40:41    

j'adore le C [:pingouino]
 
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
 
[:petrus75]

Reply

Marsh Posté le 16-05-2007 à 10:41:28    

Elmoricq a écrit :

Soit le debugger, soit le format %p de printf(), à toi de voir [:arcueid brunestud]
(ceci est un indice)


 
 
pas compris  :cry:  
 
le format %p de printf ?

Reply

Marsh Posté le 16-05-2007 à 10:50:04    

 

forcément, tu cherches à afficher une adresse avec le format %f [:mullet]

  

man printf


Message édité par Elmoricq le 16-05-2007 à 10:50:21
Reply

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 [:petrus75]

Reply

Marsh Posté le 16-05-2007 à 12:03:10    

Voila.
 
Tu as trouvé avec un debugger, ou à coup de printf() ?

Reply

Marsh Posté le 16-05-2007 à 12:48:35    

à coup de printf()  
 
hein ? tu l'avais vu et tu me l'as pas dit
 
:/

Reply

Marsh Posté le 16-05-2007 à 13:50:47    


apprendre à pêcher, donner du poisson à manger, toussa :o


---------------
Töp of the plöp
Reply

Marsh 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 [:dawao]

Reply

Marsh Posté le 01-06-2007 à 16:27:59    

[:augie]
 
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 [:pingouino]
 
est ce que cela peut etre du a une insuffisance en mémoire ?
 
genre ya plus de place donc il déplace tout ?

Reply

Marsh Posté le 01-06-2007 à 16:31:09    

Non, ca doit venir d'ailleurs.


---------------
Töp of the plöp
Reply

Marsh Posté le 01-06-2007 à 16:39:27    

parce que je me retape un segmentation fault :/ [:zytrasnif]

Reply

Marsh Posté le 01-06-2007 à 16:41:04    

C'est pas le dernier ...


---------------
Töp of the plöp
Reply

Marsh 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 ?

Reply

Marsh Posté le 01-06-2007 à 16:50:19    

Sans code c'est difficile...


---------------
Töp of the plöp
Reply

Marsh Posté le 01-06-2007 à 16:54:52    

Code :
  1. if(b==1)
  2. {
  3. printf("e4 %d %f b %d\n",e4,e4->t,b);
  4. }
  5. (indi[num_ind]).tps_sortie = determ_tps_sortie(sigma,inter3,l,(indi[num_ind]).pop.numero,T1,r1,T2,r2,(*e).t,popu);
  6. if(b==1)
  7. {
  8. printf(" nouveau e4 %d\n",e4);
  9. printf(" et pof %f\n",e4->t);
  10. }
 

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 :
  1. double determ_tps_sortie( double sigma[l][l],int * pop_arr,int l,int pop_dep,const gsl_rng_type * T1,gsl_rng * r1,const gsl_rng_type * T2,gsl_rng * r2,double t,struct Population popu[])
  2. {
  3.  
  4.        double mu,somme;
  5.        double inter,inter_2,inter_a;
  6.        int i,j,taille,permuter,k;
  7.        double * a;
  8.        double  tps_sortie;
  9.        double * N;
  10. a = malloc( l*sizeof(double));
  11. if(a== NULL)
  12. {
  13. printf("probleme allocation memoire\n" );
  14. exit(EXIT_FAILURE);
  15. }
  16. N = malloc(l*sizeof(double));
  17. if(N== NULL)
  18. {
  19. printf("probleme allocation memoire\n" );
  20. exit(EXIT_FAILURE);
  21. }
  22. somme = 0;
  23. taille = l;
  24. tps_sortie = 150000;
  25. // On fait autant de tirages que de populations et on prend le minimum a la fin uniquement
  26. for(j=0;j<l;j++)
  27. {
  28.   // on évite de faire un tirage dans la population de départ, un individu devant obligatoirement quitter la population
  29.   if( j!= pop_dep)
  30.   {
  31. // c'est le paramètre de la loi exponentielle
  32.        mu = sigma[pop_dep][j];
  33. // on tire un nombre dans la loi exponentielle, et on le place dans le vecteur tps_sortie
  34.           inter = gsl_ran_exponential(r1,mu);
  35.         // on ne prend que le plus petit temps tiré a chaque fois
  36.          if( (inter < tps_sortie) && (inter!=0.0))
  37.          {
  38.            tps_sortie = inter;
  39.            // ici on définit la population de sortie
  40.            (*pop_arr)= j;
  41.             if((*pop_arr) == pop_dep)
  42.             {
  43.              printf("error population\n" );
  44.              exit(EXIT_FAILURE);
  45.             }
  46.          }
  47.      }
  48. }
  49.   tps_sortie = tps_sortie + t;
  50.   return tps_sortie;
  51. }
 

wala pour la fonction


Message édité par Profil supprimé le 01-06-2007 à 16:57:54
Reply

Marsh Posté le 01-06-2007 à 17:02:58    

[:zytrasnif]

Reply

Marsh Posté le 01-06-2007 à 17:15:37    

Reply

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 !

Reply

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.


Message édité par el muchacho le 01-06-2007 à 17:30:30
Reply

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 [:dawa_neowen]

Reply

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)


Message édité par el muchacho le 01-06-2007 à 17:28:42
Reply

Marsh Posté le 04-06-2007 à 10:52:26    

désolé moi j'ai un .tar.bz2 et pas un .tar.gz ca marche pas [:zytrasnif]

Reply

Marsh Posté le 04-06-2007 à 10:54:55    

bunzip2 alors !!!


---------------
Töp of the plöp
Reply

Marsh Posté le 04-06-2007 à 11:04:20    

Reply

Marsh Posté le 04-06-2007 à 11:09:35    

ceci dit tu as une idée pour mon probleme elmoricq ?

Reply

Marsh Posté le 04-06-2007 à 11:10:58    

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed