[C] Bus error, arbre et fichiers

Bus error, arbre et fichiers [C] - C - Programmation

Marsh Posté le 17-05-2009 à 12:06:48    

ola
 
J'ai un probleme avec mon code qui m'emepeche de continuer :/
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #define jeux_max 500
  6. #define noeud_l sizeof(abr_index)
  7. typedef enum {PC,PS3,XBOX360,WII}SUPPORTS;
  8. typedef enum {FPS,RPG,COURSE,SPORT,STR,ACTION,COMBAT}TYPES;
  9. typedef struct JEUX{
  10.  
  11. char titre[40], nom_editeur[40];
  12. TYPES type;
  13.    SUPPORTS support;
  14.    int annee;
  15. int mode;// si 0, jeux solo, sinon, jeux multijoueur.
  16. int online;//si 0, jouable seulement offline, sinon, online disponible.
  17.    int note;
  18.   }JEUX;
  19. typedef struct abr{
  20. char cle_nom[40];
  21. int index_b;
  22. struct abr *fg, *fd;
  23. }abr_index;
  24. abr_index *ajoutabr(abr_index *it, char name[40]){
  25. abr_index *new;
  26. new->index_b = 0;
  27. if (it == NULL){
  28.  new = (abr_index*)malloc (sizeof(noeud_l));
  29.  strcpy(new->cle_nom,name);
  30.  new->index_b++;
  31.  new->fg = NULL;
  32.  new->fd = NULL;
  33. }
  34. if (strcmp(new->cle_nom,name)<0){
  35.  it->fd = ajoutabr(it->fd, name);
  36. }
  37. else if (strcmp(new->cle_nom,name)>0){
  38.  it->fg = ajoutabr(it->fg, name);
  39. }
  40. return(it);
  41. }
  42. int creation_index (abr_index *ind){
  43. int reg;
  44. JEUX j;
  45. FILE * f_jeux;
  46. abr_index *idxx;
  47. f_jeux = fopen ("jeux.txt","r" );
  48. if (f_jeux == NULL ){
  49.  printf("erreur dans l'ouverture du fichier.\n" );
  50.  exit(-1);
  51. }
  52.   while (!feof(f_jeux)){
  53.   ind = (abr_index*)malloc (sizeof(noeud_l));
  54.   fscanf(f_jeux,"%s,%s,%s,%d,%d,%d,%d,%s\n",j.titre,j.nom_editeur,j.type,&j.annee,&j.note,&j.mode,&j.online,j.support);
  55.   ajoutabr(idxx, j.titre);
  56.   }
  57. fclose (f_jeux);
  58. }
  59. int sauv_index (){
  60. FILE *f_index;
  61. abr_index *temp2;
  62. int longueur,i;
  63. f_index = fopen("index_nom.txt", "w" );
  64. if (!f_index){
  65.  printf("erreur de creation du fichier.\n" );
  66.  exit (-1);
  67. }
  68. temp2 = (abr_index*)malloc (sizeof(noeud_l));
  69. parcour_abr(temp2);
  70. fclose(f_index);
  71. }
  72. int affiche_abr (abr_index *ind){
  73. abr_index *temp;
  74. temp = (abr_index*)malloc (sizeof(noeud_l));
  75. if (temp != NULL){
  76.  printf ("\n%s,%d\n\n", temp->cle_nom,temp->index_b);
  77. }
  78. while (temp->fg != NULL){
  79.  temp = temp->fg ;
  80.  printf ("\n%s,%d\n\n", temp->cle_nom,temp->index_b);
  81.  if (temp->fg == NULL && temp->fd != NULL){
  82.   temp = temp->fd ;
  83.   printf ("\n%s,%d\n\n", temp->cle_nom,temp->index_b);
  84.  }
  85. }
  86. if (temp->fd != NULL){
  87.  temp  = temp->fd;
  88.  printf ("\n%s,%d\n\n", temp->cle_nom,temp->index_b);
  89. }
  90.  parcour_abr(temp);
  91. }
  92. int parcour_abr(abr_index *ind) {
  93.    
  94. if (ind != NULL){
  95.  printf ("%s,%d\n\n", ind->cle_nom,ind->index_b);
  96.  parcour_abr(ind->fg);
  97.  parcour_abr(ind->fd);
  98. }
  99. }
  100. int main(){
  101. abr_index *lol;
  102. creation_index(lol);
  103. affiche_abr(lol);
  104. }


 
En faite pour l'instant je voudrais juste que en executant ca, le programme m'affiche les infos stocker dans l'arbre prise a partir du fichier jeux.txt  
J'ai plusieur probleme en faite deja par raport au mode d'ouverture : que je mette R, r+ ou autre chose, j'ai Bus error. si je met a+ sa m'affiche  
 
,0
 
,0
,0
 
mais bon c'est pas ce que je veux je veux que le fichier soit parcouru et que les info soit stocké dans mon arbre ( qui servira d'index ).
Mes infos sont stocké comme ca dans mon fichier .txt :  
nom,genre,note ....
 
J'ai aussi testé une methode que j'ai trouver sur le net avec gcc pour debugger ( gdb ) et sa m'affiche sa  :  
 

Code :
  1. (gdb) run
  2. Starting program: /Users/Documents/projet
  3. Reading symbols for shared libraries ++. done
  4. Program received signal EXC_BAD_ACCESS, Could not access memory.
  5. Reason: KERN_INVALID_ADDRESS at address: 0x89068bcf
  6. 0x96df7f00 in strcmp ()


 
Je comprend pas trop si jamais vous savez d'ou proviendrai l'erreur sa serait fort aimable...
 
EDIT :  J'ai testé toutes les focntions une par une et aparament c'est bien sur la fonction ajoutabr que sa bloque


Message édité par la_decheance le 17-05-2009 à 15:29:47
Reply

Marsh Posté le 17-05-2009 à 12:06:48   

Reply

Marsh Posté le 17-05-2009 à 17:40:05    

Fais un memset(new->cle_nom, 0, 40);

Reply

Marsh Posté le 17-05-2009 à 18:08:32    

je ne connaissait pas, je ne trouve pas ou il faut le placer??

Reply

Marsh Posté le 17-05-2009 à 18:14:02    

Je dirais plutot dans creation_index(), initialise ta variable locale :
abr_index *idxx = NULL;

Reply

Marsh Posté le 17-05-2009 à 18:39:35    

ah, pu de bus error, mais en faite s'a maffiche toujours  
 
,0
,0
 
,0  
 
J'avais enlevé idxx et je travailler directement sur la valeur declaré en arguments..
je vais voir avec sa maintenant pourquoi il m'affiche que des zeros

Reply

Marsh Posté le 17-05-2009 à 18:58:16    

Ca ne t'affiche que des zeros parce que tu oublies de passer en arguments de ajoutabr() ces valeurs ...
 
Remplace :
abr_index *ajoutabr(abr_index *it, char name[40])
par
abr_index *ajoutabr(abr_index *it, JEUX* jeux)
 
... plus l'implémentation qui va avec.

Reply

Marsh Posté le 17-05-2009 à 19:06:09    

En faite j'utiliser name en locale qui serait en faite le titre d'un jeu...
je vais essayer donc en changeant ca..

Reply

Marsh Posté le 17-05-2009 à 19:10:28    

Vu cette ligne:
#define noeud_l sizeof(abr_index)
celle ci est fausse:
ind = (abr_index*)malloc (sizeof(noeud_l));
et ce devrait être:
ind = (abr_index*)malloc (noeud_l);
 
J'ai pas été voir plus loin, mais quand la première fonction invoquée a un malloc foireux, on peut s'attendre au pire pour le reste. Clairement, c'est pareil ailleurs.
A+,


Message édité par gilou le 17-05-2009 à 19:12:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-05-2009 à 19:25:58    

la_decheance a écrit :

En faite j'utiliser name en locale qui serait en faite le titre d'un jeu...
je vais essayer donc en changeant ca..


C'est surtout que tu ne stoques nul part les valeurs que tu lis dans ton fichier. A chaque boucle, le contenu de j (de type JEUX) sera écrasé.

Reply

Marsh Posté le 17-05-2009 à 19:40:27    

ahhh je me suis embrouillé..
 
mais en faite si je passe un pointeur en argument pour ajoutabr,  je dois aussi passer un argument de même type dans la fonction creation mais ca me fais tout changer et passer j en pointeur de JEUX...
 
pour stocker apres le fscanf je dois refarie sa dans une structure ( avec un malloc? )  
 


Message édité par la_decheance le 17-05-2009 à 19:43:18
Reply

Sujets relatifs:

Leave a Replay

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