IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Debutant , gestion d'une file , segmentation fault


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut Debutant , gestion d'une file , segmentation fault
    Bonjour , je cherche à écrire un programe de base sur la gestion d'une file.Mon code est compilé mais il y une erreur de segmentation dans la fonction enfiler apparemment.Seulement je ne comprends pas ou est l'erreur.Voilà mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #include <stdio.h> 
    #include <stdlib.h>
     
    struct maillon
    {
    int valeur;
    struct maillon* suivant;
    };
     
    typedef struct maillon* pmaillon;
     
    void creer_file (pmaillon* file)//Creer une file vide
    {
    *file=(pmaillon)malloc(sizeof(struct maillon));
    *file=NULL;
    }
     
    int file_vide (pmaillon* file)//Renvoie 1 si vide 0 sinon
    {
    if (*file==NULL) return 1;
    	else return 0;
    }
     
    int premier (pmaillon* file)//Renvoie le premier maillon de la file si il existe
    {
    if (file_vide (file))
    	{
    	printf ("La liste est vide\n");
    	exit(EXIT_FAILURE);
    	}
    	else return ((*file)->valeur);
    }
     
    void enfiler (pmaillon* file)//Ajoute un élément à la fin de la file
    {
    int x;
    pmaillon new,temp;
    creer_file (&new);
    printf ("Quel valeur voulez vous ajoutez à la fin de la file?\n");
    scanf ("%d",&x);
    temp=*file;
    new->valeur=x;
    new->suivant=NULL;
    while (temp->suivant!=NULL)
    	{
    	temp=temp->suivant;
    	}
    temp->suivant=new;
    *file=temp;
    }
     
    void defiler (pmaillon* file)//Supprime le premier elt de la liste
    {
    *file=(*file)->suivant;
    }
     
    int main()
    {
    pmaillon debut;
    creer_file (&debut);
    enfiler (&debut);
    printf("%d\n",premier (&debut));
    enfiler (&debut);
    printf("%d\n",premier (&debut));
    enfiler (&debut);
    printf("%d\n",premier (&debut));
    defiler (&debut);
    printf("%d\n",premier (&debut));
    defiler (&debut);
    defiler (&debut);
    printf("%d\n",premier (&debut));
    return EXIT_SUCCESS;
    }
    Si vous pouvez m'aiguiller , merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Le problème vient de ta fonction creer_file. Tu alloue un pointeur et ensuite tu lui attribue une adresse NULL. En gros quand tu essaye d'écrire dans ton file, tu essaye d'écrire à l'adresse 0x0 d'où ton segmentation fault.
    "L'insanité consiste à répéter la même action dans l'espoir d'aboutir à un résultat différent" Albert Einstein
    ----------------------
    T.O.A.O 6-MarViN

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    Oui effectivement , ce n'est pas la seul erreur , mais le gros de mon probleme vient de là.Je vais chercher pour les autres.
    Merci.

  4. #4
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Ah !! Les listes chaînées !! Et les pointeurs de pointeur pour corser un peu.
    tu as surement voulu faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void creer_file (pmaillon* file)//Creer une file vide
    {
    *file=(pmaillon)malloc(sizeof(struct maillon));
    memset(*file, 0, sizeof(struct maillon));
    }
    Dans enfiler, il ne faut suretout pas mettre la dernière ligne. Là tu es en train décraser ta liste chaînée. (*file=temp; à virer !!)

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    Oui , bonne remarque.J'ai enfin reussi à faire tourner ce programme.Voila le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #include <stdio.h> 
    #include <stdlib.h>
     
    struct maillon
    {
    int valeur;
    struct maillon* suivant;
    };
     
    typedef struct maillon* pmaillon;//pmaillon pour pointeur sur struct maillon
     
    void creer_file (pmaillon* file)//Creer une file vide
    {
    *file=(pmaillon)malloc(sizeof(struct maillon));
    }
     
    int file_vide (pmaillon* file)//Renvoie 1 si vide 0 sinon
    {
    if (*file==NULL) return 1;
    	else return 0;
    }
     
    int premier (pmaillon* file)//Renvoie le premier maillon de la file si il existe
    {
    if (file_vide (file))
    	{
    	printf ("La liste est vide\n");
    	exit(EXIT_FAILURE);
    	}
    	else return ((*file)->valeur);
    }
     
    void incremente_dernier (int x,pmaillon* file)//RECURSIF , plus adapté pour le parcours des listes
    {
    pmaillon new,temp;
    if ((*file)->suivant==NULL)//Cas d'arret car incrementation de x à la fin de la file
    	{
    	creer_file (&new);
    	new->valeur=x;
    	new->suivant=NULL;
    	(*file)->suivant=new;
    	}
    	else incremente_dernier (x,&((*file)->suivant));
    }
     
    void enfiler (pmaillon* file)//Ajoute un élément à la fin de la file
    {
    int x;
    printf ("Quel valeur voulez vous ajoutez à la fin de la file?\n");
    scanf ("%d",&x);
    if ((*file)->valeur==0) (*file)->valeur=x; //Premiere utilisation de la liste
    else incremente_dernier (x,file);//Il y a au moins un élément!=0 dans la liste
    }
     
    void defiler (pmaillon* file)//Supprime le premier elt de la liste
    {
    *file=(*file)->suivant;
    }
     
    int main()
    {
    pmaillon debut;
    creer_file (&debut);
    enfiler (&debut);
    printf("Le premier de la liste est %d\n",premier (&debut));
    enfiler (&debut);
    printf("Le premier de la liste est %d\n",premier (&debut));
    enfiler (&debut);
    printf("Le premier de la liste est %d\n",premier (&debut));
    enfiler (&debut);
    printf("Le premier de la liste est %d\n",premier (&debut));
    defiler (&debut);
    printf("Le premier de la liste est %d\n",premier (&debut));
    defiler (&debut);
    printf("Le premier de la liste est %d\n",premier (&debut));
    defiler (&debut);
    printf("Le premier de la liste est %d\n",premier (&debut));
    defiler (&debut);
    return EXIT_SUCCESS;
    }
    Merci à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Iteration sur une liste ==> segmentation fault
    Par StingerBell dans le forum C++
    Réponses: 16
    Dernier message: 19/06/2014, 14h28
  2. gestion d'une file d'attente avec report 10G
    Par sithe dans le forum Reports
    Réponses: 0
    Dernier message: 15/06/2011, 01h49
  3. Gérer une liste -Segmentation Fault
    Par Trademark dans le forum Débuter
    Réponses: 2
    Dernier message: 22/03/2010, 23h41
  4. Traiter une erreur "Segmentation Fault"
    Par Looney dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2009, 06h51
  5. Gestion d'une file d'attente
    Par jesus144 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/09/2005, 19h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo