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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1704286
manubestof​plus
Posté le 18-03-2008 à 22:10:49  profilanswer
 

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
mood
Publicité
Posté le 18-03-2008 à 22:10:49  profilanswer
 

n°1704291
xilebo
noone
Posté le 18-03-2008 à 22:19:57  profilanswer
 

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).

n°1704292
Trap D
Posté le 18-03-2008 à 22:21:56  profilanswer
 

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 !

n°1704293
Elmoricq
Modérateur
Posté le 18-03-2008 à 22:21:57  profilanswer
 

A quel endroit ca plante ?

n°1704298
Elmoricq
Modérateur
Posté le 18-03-2008 à 22:33:00  profilanswer
 

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
n°1704299
manubestof​plus
Posté le 18-03-2008 à 22:37:28  profilanswer
 

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


Message édité par manubestofplus le 18-03-2008 à 22:39:35
n°1704307
manubestof​plus
Posté le 18-03-2008 à 22:49:58  profilanswer
 

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

n°1704309
manubestof​plus
Posté le 18-03-2008 à 23:03:20  profilanswer
 

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
n°1704310
Joel F
Real men use unique_ptr
Posté le 18-03-2008 à 23:08:31  profilanswer
 

ton chemin de fichier est il correct

n°1704311
manubestof​plus
Posté le 18-03-2008 à 23:11:58  profilanswer
 

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
mood
Publicité
Posté le 18-03-2008 à 23:11:58  profilanswer
 

n°1704318
manubestof​plus
Posté le 18-03-2008 à 23:37:53  profilanswer
 

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

n°1704385
Trap D
Posté le 19-03-2008 à 09:22:34  profilanswer
 

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.


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

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

 

Sujets relatifs
probleme avec php web galleryerreur Notice: Undefined offset
[php]Erreur d'inscription de formulaire dans une BDDProbleme de script?
[PHP] Forcer le download - Problème avec IE en remoteUpload de fichier + création de répertoire: Erreur d'Array !!?
[C]Arbres et seg fault[resolu]problème alignement...
Problème de JMenuBar 
Plus de sujets relatifs à : [resolu(erreur de noob)]Probleme "segment fault"


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