Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2017 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Segmentation Fault : bersoin d'aide

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Segmentation Fault : bersoin d'aide

n°1560948
Profil sup​primé
Posté le 16-05-2007 à 10:12:16  answer
 

[: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
mood
Publicité
Posté le 16-05-2007 à 10:12:16  profilanswer
 

n°1560950
_darkalt3_
Proctopathe
Posté le 16-05-2007 à 10:13:54  profilanswer
 

t'as passé le debugger ?


---------------
Töp of the plöp
n°1560951
Profil sup​primé
Posté le 16-05-2007 à 10:14:30  answer
 

non et je sais pas m'en servir :/

n°1560952
Elmoricq
Modérateur
Posté le 16-05-2007 à 10:15:25  profilanswer
 

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
n°1560953
Elmoricq
Modérateur
Posté le 16-05-2007 à 10:15:53  profilanswer
 

 

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
n°1560954
Profil sup​primé
Posté le 16-05-2007 à 10:17:23  answer
 

Elmoricq a écrit :

Apprends, c'est un outil essentiel au développement. :)


 
 
il faut que j'utilise quel logiciel sous linux pour faire ça ?

n°1560955
Elmoricq
Modérateur
Posté le 16-05-2007 à 10:18:46  profilanswer
 

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
n°1560964
_darkalt3_
Proctopathe
Posté le 16-05-2007 à 10:25:27  profilanswer
 
n°1560965
Elmoricq
Modérateur
Posté le 16-05-2007 à 10:27:35  profilanswer
 

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]

n°1560967
_darkalt3_
Proctopathe
Posté le 16-05-2007 à 10:28:44  profilanswer
 

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
mood
Publicité
Posté le 16-05-2007 à 10:28:44  profilanswer
 

n°1560968
Profil sup​primé
Posté le 16-05-2007 à 10:29:12  answer
 

merci :)
 
ceci dit s'il yen a qui ont envie de chercher tout de meme l'erreur ca serait sympa :D

n°1560973
Elmoricq
Modérateur
Posté le 16-05-2007 à 10:31:02  profilanswer
 

_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]

n°1560979
_darkalt3_
Proctopathe
Posté le 16-05-2007 à 10:32:15  profilanswer
 

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


---------------
Töp of the plöp
n°1560984
Elmoricq
Modérateur
Posté le 16-05-2007 à 10:37:12  profilanswer
 


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

n°1560988
Profil sup​primé
Posté le 16-05-2007 à 10:40:41  answer
 

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]

n°1560990
Profil sup​primé
Posté le 16-05-2007 à 10:41:28  answer
 

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 ?

n°1561000
Elmoricq
Modérateur
Posté le 16-05-2007 à 10:50:04  profilanswer
 

 

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
n°1561062
Profil sup​primé
Posté le 16-05-2007 à 11:58:50  answer
 

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]

n°1561069
Elmoricq
Modérateur
Posté le 16-05-2007 à 12:03:10  profilanswer
 

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

n°1561099
Profil sup​primé
Posté le 16-05-2007 à 12:48:35  answer
 

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

n°1561130
_darkalt3_
Proctopathe
Posté le 16-05-2007 à 13:50:47  profilanswer
 


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


---------------
Töp of the plöp
n°1561250
Elmoricq
Modérateur
Posté le 16-05-2007 à 15:35:25  profilanswer
 


 
Attends, si on te donne des indices c'est qu'on a vu où était le problème, hein [:dawao]

n°1568704
Profil sup​primé
Posté le 01-06-2007 à 16:27:59  answer
 

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

n°1568706
_darkalt3_
Proctopathe
Posté le 01-06-2007 à 16:31:09  profilanswer
 

Non, ca doit venir d'ailleurs.


---------------
Töp of the plöp
n°1568714
Profil sup​primé
Posté le 01-06-2007 à 16:39:27  answer
 

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

n°1568716
_darkalt3_
Proctopathe
Posté le 01-06-2007 à 16:41:04  profilanswer
 

C'est pas le dernier ...


---------------
Töp of the plöp
n°1568719
Profil sup​primé
Posté le 01-06-2007 à 16:48:07  answer
 

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 ?

n°1568721
_darkalt3_
Proctopathe
Posté le 01-06-2007 à 16:50:19  profilanswer
 

Sans code c'est difficile...


---------------
Töp of the plöp
n°1568725
Profil sup​primé
Posté le 01-06-2007 à 16:54:52  answer
 

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
n°1568728
Profil sup​primé
Posté le 01-06-2007 à 17:02:58  answer
 

[:zytrasnif]

n°1568735
el muchach​o
Comfortably Numb
Posté le 01-06-2007 à 17:15:37  profilanswer
 
n°1568736
Profil sup​primé
Posté le 01-06-2007 à 17:16:34  answer
 

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 !

n°1568737
el muchach​o
Comfortably Numb
Posté le 01-06-2007 à 17:19:50  profilanswer
 

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
n°1568739
Profil sup​primé
Posté le 01-06-2007 à 17:23:00  answer
 

merci j'ai downloadé mais je sais pas l'installé
 
oui oui je suis un noob [:dawa_neowen]

n°1568742
el muchach​o
Comfortably Numb
Posté le 01-06-2007 à 17:27:57  profilanswer
 

> 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
n°1569480
Profil sup​primé
Posté le 04-06-2007 à 10:52:26  answer
 

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

n°1569488
_darkalt3_
Proctopathe
Posté le 04-06-2007 à 10:54:55  profilanswer
 

bunzip2 alors !!!


---------------
Töp of the plöp
n°1569497
Elmoricq
Modérateur
Posté le 04-06-2007 à 11:04:20  profilanswer
 
n°1569502
Profil sup​primé
Posté le 04-06-2007 à 11:09:35  answer
 

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

n°1569504
Elmoricq
Modérateur
Posté le 04-06-2007 à 11:10:58  profilanswer
 
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Segmentation Fault : bersoin d'aide

 

Sujets relatifs
Aide pour VB .NetGnu Scientific Library : besoin d'aide avec la génération de nombre al
programmer sur nokia serie 40 a l'aide SVPAide requete oracle, sum sur 2 tables différentes
Aide sur VBA ExcelBesoin d'aide pour un petit programme de rien... :)
Gros pb visual C++ Runtime Librairy. A l'aide !!!!![PHP] Aide au sujet d'une fonction et gestion d'erreur
Shell-script (Besoin d'aide)[URGENT] besoin d'aide LoginForm
Plus de sujets relatifs à : Segmentation Fault : bersoin d'aide


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR