[resolu(erreur de noob)]Probleme "segment fault"

Probleme "segment fault" [resolu(erreur de noob)] - C - Programmation

Marsh Posté le 18-03-2008 à 22:10:49    

Bonsoir a tous!
voila dans le cadre d'un mini projet en language C,je developpe un programme qui prend le principe d'un labyrinthe.
J'ai programmé la majeur partie du programme,et aucune erreur a la compilation.
seulement a l'execution,pas moyen d'executer,et on me renvoie un "segment fault"...
j'ai demandé l'avis d'un ami plutôt calé en programmation,mais pas de solution trouvée.
Selon lui,l'erreur viendrait d'une utilisation d'un fopen .
je fais donc appel a vous...
 
Faut il que je mette le code...??
sans,je pense que vous auriez du mal a m'aider...
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "labyrinthe.h"
  4.  
  5.  
  6. #define nbcase 16
  7. #define MAX 300
  8.  
  9. int X;
  10. int Y;
  11. int position;
  12. char choix,Question,reponse,proposition;
  13. int succes,i,j;
  14. char a,b,c,d,n,s,o,e;
  15.  
  16. /*initialisation du tableau */
  17.  
  18. laby initialisation_laby( int variable ){
  19. variable=nbcase;
  20. laby tab[16];
  21. char ch[MAX];
  22.  
  23. FILE *def;
  24.  
  25. def=fopen("/Bureau/projetc/config.txt","r" );
  26. printf("%x",def);
  27.  
  28. while( !feof(def))
  29.    {
  30.      for (i=0;i<nbcase;i++)
  31.    {
  32.        fgets(ch,MAX,def);
  33.        sscanf(ch,"%*d: %c %c %c %c",&tab[i].nord,&tab[i].sud,&tab[i].ouest,&tab[i].est);
  34.    }
  35. }
  36. }
  37.  
  38.  
  39. /* deplacement dans le labyrinthe */
  40.  
  41. laby deplacement(int position){
  42. laby tab[16];
  43. char cha[MAX],chb[MAX],chc[MAX],chd[MAX];
  44.    printf("entrez votre choix de deplacement:(n pour nord,s pour sud,o pour ouest,e pour est)" );
  45.    scanf("%c",choix);
  46.    succes=0;
  47.    if (choix==n)
  48.      {  
  49.        a=tab[position].nord;
  50.  
  51.     switch(a){
  52.                case 'o':
  53.                position-=4;
  54.                break;
  55.        
  56.           case 'v':
  57.                           position-=4;
  58.                break;
  59.  
  60.           case 'f':
  61.                printf("porte fermee=question..." );
  62.                 FILE *def;
  63.                 def=fopen("/Bureau/projetc/config.txt","r" );
  64.                while( !feof(def))
  65.                 {
  66.                      fgets(cha,MAX,def);
  67.                        sscanf(cha,"%s : %s",Question,reponse);
  68.                  }
  69.                printf("question:",Question);
  70.                printf("\n" );
  71.                printf("saisissez votre reponse\n" );
  72.                scanf("%c",proposition);
  73.                if (proposition ==reponse)
  74.                  {
  75.                 succes=1;
  76.                  }
  77.                else
  78.                 {
  79.                 succes=0;
  80.                 }    
  81.                if (succes==1)
  82.                 {
  83.                         printf("bonne réponse!!!" );                
  84.                     position-=4;
  85.                 }
  86.                 else
  87.                 {printf("mauvaise reponse" );    
  88.                     break;
  89.                 }
  90.  
  91.           case 'm':
  92.                printf("c'est un mur,deplacement impossible vers le nord" );
  93.                break;
  94.  
  95.           case 's':
  96.                printf("bravo,vous avez gagné" );
  97.                position=0;    
  98.  
  99.                  }


 
d'avance,merci pour votre aide...
 
elmoricq-edit : balises codes...


Message édité par manubestofplus le 18-03-2008 à 23:22:35
Reply

Marsh Posté le 18-03-2008 à 22:10:49   

Reply

Marsh Posté le 18-03-2008 à 22:19:57    

Sur quel système es-tu ?
 
Si tu es sous linux, utilise le debugger gdb pour trouver l'erreur. Il faut bien sur compiler son programme avec les symboles de debug (option -g de gcc).

Reply

Marsh Posté le 18-03-2008 à 22:21:56    

Code :
  1. while( !feof(def))
  2.     {
  3.       for (i=0;i<nbcase;i++)
  4.     {
  5.         fgets(ch,MAX,def);
  6.         sscanf(ch,"%*d: %c %c %c %c",&tab[i].nord,&tab[i].sud,&tab[i].ouest,&tab[i].est);
  7.     }
  8. }
  9. }

Encore une mauvaise utilisation de feof !
Il faut faire des fgets tant qu'il ne renvoie pas NULL !

Reply

Marsh Posté le 18-03-2008 à 22:21:57    

A quel endroit ca plante ?

Reply

Marsh Posté le 18-03-2008 à 22:33:00    

Code :
  1. #define nbcase 16
  2. #define MAX 300
 

Utilise une seule norme pour le nom de tes macros. Ce sera plus clair pour les futurs lecteurs de ton programme ensuite (futur lecteur, ca peut etre toi dans 3 semaines, un programme ca s'oublie vite).
Et a propos de relecture, corrige ton indentation aussi. Ca a l'air inutile, d'avoir une indentation propre, mais je peux t'assurer que c'est au contraire essentiel : ca permet une relecture du code claire, et donc ca te donne une meilleure maintenabilite.

 
Code :
  1. int X;
  2. int Y;
  3. int position;
  4. char choix,Question,reponse,proposition;
  5. int succes,i,j;
  6. char a,b,c,d,n,s,o,e;
 

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHH !!! [:ummon]
Variables globales == c'est mal (hormis un ou deux cas particulier, ce qui n'est pas le cas ici).
La raison est simple : sans notion de portee, si ton programme se complexifie tu n'as plus moyen de connaitre les impacts  si tu modifies l'une de ces variables.

 


Code :
  1. def=fopen("/Bureau/projetc/config.txt","r" );
  2. printf("%x",def);
 

Non. Si fopen() echoue, NULL est retourne. Et tenter d'afficher NULL, a priori, ca se termine en plantage.

 
Code :
  1. while( !feof(def))


Non plus. Lis la documentation sur feof() : ca sert a determiner la raison pour laquelle une lecture de flux a echoue.
Et si la lecture a echoue a cause d'une erreur quelconque (et non a cause d'une fin de fichier), feof() retournera toujours 0, ce sera ferror() qui retournera 1.
Bref, il faut tester ici le retour de fgets(), et seulement ensuite, si tu en as envie, tu peux utilser feof() pour savoir si la lecture s'est termine parce que tu es arrive en fin de flux.

 
Code :
  1. }
  2. }
  3. }
 

Ca compile, ca ? Sans erreur ? Impossible : ta fonction est censee retourner une valeur de type "laby", et il n'y a aucun return a la fin de ta fonction.

 
Code :
  1. scanf("%c",choix);


Nah, utilise fgetc() plutot. La fonction scanf() n'est pas aussi simple que ca pour pouvoir l'utiliser de maniere sure.

  


Bon, j'ai pas le temps de lire le reste, normalement tu devrais avoir pas mal de clefs pour corriger ton programme.


Message édité par Elmoricq le 18-03-2008 à 22:34:30
Reply

Marsh Posté le 18-03-2008 à 22:37:28    

je vais essayer de corriger tout ca...
je vous tiens au courant


Message édité par manubestofplus le 18-03-2008 à 22:39:35
Reply

Marsh Posté le 18-03-2008 à 22:49:58    

g justement un probleme avec le fopen car def renvoie null,mais je n'arrive pas a le resoudre...:(

Reply

Marsh Posté le 18-03-2008 à 23:03:20    

Code :
  1. def=fopen("/Bureau/projetc/config.txt","r" );
  2. printf("%x",def);
  3. Non. Si fopen() echoue, NULL est retourne. Et tenter d'afficher NULL, a priori, ca se termine en plantage.


 
que dois-je faire alors...??


Message édité par manubestofplus le 18-03-2008 à 23:03:56
Reply

Marsh Posté le 18-03-2008 à 23:08:31    

ton chemin de fichier est il correct

Reply

Marsh Posté le 18-03-2008 à 23:11:58    

je viens de trouver un truc desesperement et justement en verifiant l'emplacement du fichier,j'avais mis /Bureau/projetc/config.txt au lieu de /home/amaury/Bureau/projetc/config.txt
 
Resultat:plus de segment fault^^
merci pour votre aide,a présent je m'occupe du reste!!!


Message édité par manubestofplus le 18-03-2008 à 23:16:09
Reply

Marsh Posté le 18-03-2008 à 23:11:58   

Reply

Marsh Posté le 18-03-2008 à 23:37:53    

j'ai parlé trop vite...
aprés avoir modifié l'emplacement du fichier,j'arrive jusqu'a la question qui demande le choix de deplacement(nord,sud,est ou ouest),et une fois que je rentre mon choix,revoila mon segment fault...
sniff

Reply

Marsh Posté le 19-03-2008 à 09:22:34    

On t'a déjà dit de ne pas utiliser scanf, et si tu l'utilises fais le correctement.
scanf("%c",&choix);
Mais de toute façoàn tu auras des problèmes ailleurs.
Pour toutes les saisies humaines il FAUT faire fgets(buf, sizeof buf, stdin).
Ensuite tu étudies la saisie.

Reply

Sujets relatifs:

Leave a Replay

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