[C] seg fault : please help [file avec des listes]

seg fault : please help [file avec des listes] [C] - C++ - Programmation

Marsh Posté le 23-03-2003 à 22:13:11    

Salut,
voilà une verison avec les listes de ma file ( cf post :  
http://forum.hardware.fr/forum2.ph [...] subcat=386
ou
http://forum.clubic.com/forum2.php [...] &subcat=36 )
J'ai localisé l'endroit où ca plante, mais je sais pas pourquoi !!
Vopilà la fonction et les déclarations :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /* La structure de la liste */
  4. struct elementliste {
  5.   int valeur;
  6.   struct elementliste *suivant;
  7. };
  8. typedef struct elementliste ElementListe;
  9. typedef ElementListe * Liste;
  10. /* La structure de la file */
  11. struct File_struct {
  12.   Liste Fliste;
  13.   ElementListe *fin;
  14. };
  15. typedef struct File_struct File;
  16. /* Pour ajouter un elt en fin de file */
  17. int Ajouter_En_Fin ( File *file , int x ){
  18.   ElementListe *newelement;
  19.   /* creation nouvelle boite */
  20.   newelement = (ElementListe*) malloc(sizeof (ElementListe));
  21.   if (newelement == NULL){  /* verification allocation */
  22.     fprintf(stderr,"Erreur lors du malloc de l'ajout en fin de file !!" );
  23.     return 0;
  24.   }
  25.  
  26.   /* mise a jour valeur */
  27.   newelement->valeur= x;
  28.  
  29.   /* mise a jour pointeur suivant du dernier element */
  30.   newelement->suivant = NULL;
  31.   /* mise a jour pointeur fin */
  32.   (*(*file).fin).suivant = newelement;
  33.   file->fin = (file->fin)->suivant;
  34.   /*si arrivé ici, ok -> return 1*/
  35.   return 1;
  36. }


Là où ca plante, c'est ici :

Code :
  1. /* mise a jour pointeur fin */
  2.   (*(*file).fin).suivant = newelement;


 
C'est probable que la ligne d'apres plante aussi, mais j'ai pas peu aller jusque là !!
 
Au fait, la file a été initialisée comme ceci :

Code :
  1. /* Pour initialiser la file */
  2. int Init ( File *file , int n ){
  3.   file->Fliste = Creer_Vide();
  4.   file->fin = file->Fliste;
  5.   return 1;
  6. }


 
Voilà, merci @+
Miles


Message édité par Miles--Teg le 23-03-2003 à 22:14:26

---------------
Recherchez la liberté et devenez esclave de vos désirs. Recherchez la discipline et trouvez votre liberté.
Reply

Marsh Posté le 23-03-2003 à 22:13:11   

Reply

Marsh Posté le 23-03-2003 à 23:38:49    

Que vaut 'fin' après l'appel à ta fonction 'Init' ?
 
il vaudrait pas 'NULL' par hazard ?
 
donc quand tu fais '(*(*file).fin).' tu déréférences un pointeur nul, donc seg fault.


Message édité par SquiZZ le 23-03-2003 à 23:40:15
Reply

Marsh Posté le 24-03-2003 à 09:43:37    

Miles--Teg a écrit :


Code :
  1. /* mise a jour pointeur fin */
  2.   (*(*file).fin).suivant = newelement;




Mieux (la lecture est plus simple) d'utiliser

Code :
  1. file->fin->suivant = ...;


Sinon, Squizz a raison: ton file->fin est null, or tu tente file->fin->suivant qui n'est pas en mémoire ...

Reply

Marsh Posté le 24-03-2003 à 18:26:10    

en effet !
Je m'en sus aperçu ce matin !!!
Merci !
mùaintenant ca marche :
 

Code :
  1. /* Pour initialiser la file */
  2. int Init ( File *file , int n ){
  3.   file->tete = Creer_Vide();
  4.   file->fin = file->tete;
  5.   return 1;
  6. }
  7. /* Pour ajouter un elt en fin de file */
  8. int Ajouter_En_Fin ( File *file , int x ){
  9.            Liste newelement;
  10.          
  11.           /* creation nouvelle boite */ 
  12.           newelement = (Liste) malloc(sizeof (ElementListe));
  13.           if (newelement == NULL){  /* verification allocation */ 
  14.             fprintf(stderr,"Erreur lors du malloc de l'ajout en fin de file !!" ); 
  15.             return 0; 
  16.       } 
  17.        
  18.       /* mise a jour valeur */ 
  19.       newelement->valeur= x; 
  20.        
  21.       /* mise a jour pointeur suivant du dernier element */ 
  22.       newelement->suivant = NULL; 
  23.      
  24.       /* mise a jour pointeur fin */ 
  25.       if((*file).fin==NULL)   ((*file).fin) = newelement;
  26.       else {
  27.              ((*file).fin->suivant) =newelement;
  28.              ((*file).fin) =newelement;
  29.       }
  30.       if((*file).tete==NULL) ((*file).tete) = newelement;
  31.        
  32.       /*si arrivé ici, ok -> return 1*/ 
  33.       return 1; 
  34. }
  35. /* Pour créer une liste vide */
  36. Liste Creer_Vide (){
  37.   return NULL;
  38. }

 
 
Voilà !
merci @+
Miles


---------------
Recherchez la liberté et devenez esclave de vos désirs. Recherchez la discipline et trouvez votre liberté.
Reply

Marsh Posté le 24-03-2003 à 18:36:20    

SquiZz a écrit :

'(*(*file).fin).'

au passage, les flèches, ça augmente la lisibilité ;)

Reply

Marsh Posté le 24-03-2003 à 18:44:08    

++Taz a écrit :

au passage, les flèches, ça augmente la lisibilité ;)  


 
j'ai repris la notation de miles, c'est tout.
 
Dans le même esprit, il faut mieux éviter de différenceier des variables/structures/type uniquement avec la casse.
File ça ressemble beaucoup à file qui ressemble beaucoup à FILE (un mot reservé en passant). Ca n'aide pas à comprendre un code.

Reply

Marsh Posté le 24-03-2003 à 18:47:09    

SquiZz a écrit :

à FILE (un mot reservé en passant)


type opaque défini par la bibliothèque standard tu veux dire

Reply

Marsh Posté le 24-03-2003 à 18:49:11    

++Taz a écrit :


type opaque défini par la bibliothèque standard tu veux dire


 
admettons.

Reply

Marsh Posté le 24-03-2003 à 22:02:25    

C'est vrai que file ca peut preter à confusion !!!
*Mais pour dire file (genre file d'attente) j'ai pas trouvé autre chose !!!!
 
Des idees ??
 
 
Voilà la version finale :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /* La structure de la liste */
  4. typedef struct elt_struct {
  5.   int valeur;
  6.   struct elt_struct *suivant; 
  7. } ElementListe; 
  8. typedef ElementListe *Liste;
  9. /* La structure de la file */ 
  10. typedef struct file_struct {
  11.   Liste tete;
  12.   Liste fin;
  13. } File;
  14. /* On inclue ici les en-têtes des fonctions */
  15. #include "file.h"
  16. /* ***************************************************** */
  17. /* Entrée :  nothing                                     */
  18. /* Sortie :  le pointeur NULL                            */
  19. /* Complexité :                                          */
  20. /* Description : Crée une liste vide                     */
  21. /* ***************************************************** */
  22. Liste Creer_Vide ();   /* declarée seule car les autres sont */
  23.                        /* dans la declaration commune        */
  24. /* Pour initialiser la file */
  25. int Init ( File *file , int n ){
  26.   file->tete = Creer_Vide();
  27.   file->fin = file->tete;
  28.   return 1;
  29. }
  30. /* Pour ajouter un elt en fin de file */
  31. int Ajouter_En_Fin ( File *file , int x ) {
  32.   Liste newelement;
  33.   /* creation nouvelle boite */
  34.   newelement = (Liste) malloc(sizeof (ElementListe));
  35.   if (newelement == NULL){  /* verification allocation */
  36.     fprintf(stderr,"Erreur lors du malloc de l'ajout en fin de file !!" );
  37.     return 0;
  38.   }
  39.   /* mise a jour valeur */
  40.   newelement->valeur= x;
  41.    
  42.   /* mise a jour pointeur suivant du dernier element */
  43.   newelement->suivant = NULL;
  44.  
  45.   /* mise a jour pointeur fin */
  46.   if( file->fin == NULL ) {
  47.     file->fin = newelement;
  48.   }
  49.   else {
  50.     file->fin->suivant = newelement;
  51.     file->fin = newelement;
  52.   }
  53.   if((*file).tete==NULL) {
  54.     ((*file).tete) = newelement;
  55.   }
  56.   /*si arrivé ici, ok -> return 1*/
  57.   return 1;
  58. }
  59. /* Pour récuperer le 1er elt de la file */
  60. int Tete ( File file , int *val ){
  61.   if( file.tete == NULL) {
  62.     printf("\nErreur 1 : la file est vide !!\n" );
  63.     return 0;
  64.   }
  65.   *val = (file.tete)->valeur;
  66.   return 1;
  67. }
  68. /* Pour supprimer le 1er elt de la file */
  69. int Supprimer_Tete ( File *file ){
  70.   ElementListe *elemList ;
  71.   if ( file->tete == NULL ) {
  72.     printf("\nErreur 2 : la file est vide !!\n" );
  73.     return 0;
  74.   }
  75.   elemList = file->tete; /* Mémorisation de la zone a détruire */
  76.   file->tete = (file->tete)->suivant; /* Réaffectation du début de la file */
  77.   free(elemList); /* Libérartion de la mémoire o q p par m'elt */
  78.   return 1;
  79. }
  80. /* Pour détruire la file à la fin */
  81. int Detruit ( File *file ){
  82.   return 0;
  83. }
  84. /* Pour tester si la file est vide */
  85. int Est_Vide ( File *file ){
  86.   if( file->tete == NULL ) {
  87.     return 1;
  88.   }
  89.   return 0;
  90. }
  91. /* Pour créer une liste vide */
  92. Liste Creer_Vide (){
  93.   return NULL;
  94. }
  95. /* Pour afficher la file */
  96. void Affiche ( Liste  l ) {
  97.   if ( l!=NULL ) {
  98.     printf("%d ",l->valeur);
  99.     Affiche ( l->suivant );
  100.   }
  101.   else {
  102.     printf("-\n" );
  103.   }
  104. }
  105. /* ************ Main ************ */
  106. int main () {
  107.    
  108.   int rep;
  109. /* creer une file */
  110.   File file;
  111.   int elem;
  112.   int n, i, j;
  113.   printf("\nDonnez n : " );
  114.   scanf("%d",&n);
  115.   printf("\totototototo\n" );
  116.   Init ( &file , n );
  117.   Affiche ( file.tete );
  118.  
  119.   system("PAUSE" );
  120.  
  121.   printf("\nOn va initialiser la file à n éléments!!\n" );
  122.   printf("Donnez n : " );
  123.   scanf("%d",&n);
  124.   Init ( &file , n );
  125.   printf("\nInitialisation terminée\n" );
  126.   printf("Je met dans la file les elts 1...n\n" );
  127.   for ( j=0 ; j<n ; j++ ) {
  128.     i = Ajouter_En_Fin ( &file, j+1 );
  129.   }
  130.   printf("\nFile : " );
  131.   Affiche ( file.tete );
  132.   rep = 0;
  133.  
  134.   /* Boucle de test pour la file avec les,opérations implémentées :       */
  135.   /* Ajouter_en_fin  */
  136.  
  137.   while ( rep != 4 ) {
  138.     printf("donnez une commande :" );
  139.     printf("\n\t1 : pour ajouter\n\t2 : pour supprimer un element\n\t" );
  140.     printf("3 : pour afficher la file\n\t4 : pour quitter\nVotre choix : " );
  141.     scanf("%d",&rep);
  142.    
  143.     if ( rep == 1 ) { /* ajouter un elem */
  144.       printf("Donnez l'entier à ajouter : " );
  145.       scanf("%d", &elem);
  146.       i = Ajouter_En_Fin ( &file, elem );
  147.       Affiche ( file.tete );
  148.     }
  149.     else {
  150.       if ( rep == 2 ) { /* supprime l'element de tete */
  151.         i = Supprimer_Tete ( &file );
  152.         Affiche( file.tete );
  153.       }
  154.       else
  155.         if ( rep == 3 ) { /* Affiche la file */
  156.           Affiche ( file.tete );
  157.         }
  158.         else {
  159.           if ( rep == 4 ) {
  160.             printf ("Fin ...\n" );
  161.           }
  162.         }
  163.       }
  164.     }
  165.   }
  166.  
  167.   printf("\n" );
  168.   return 0;
  169. } /* ************ Fin main ************ */

 
 
@+
Miles


---------------
Recherchez la liberté et devenez esclave de vos désirs. Recherchez la discipline et trouvez votre liberté.
Reply

Marsh Posté le 24-03-2003 à 22:09:47    

priority_queue

Reply

Sujets relatifs:

Leave a Replay

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