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 :

Problème d'affichage de ma liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Par défaut Problème d'affichage de ma liste chainée
    Bonjour.

    Voici les codes de mon programme d'ajout d'information en tête dans ma liste chaînée :

    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
    #define a 100
    #define sp printf("\n")
    typedef struct fic
    {
        char nom[a];
        int x;
        struct fic *svt;
        struct fic *pcd;
    }fic;
     
    fic ajouterentete(fic*);
     
    void main(void)
    {
        fic *ptrfic=NULL,*tmp=NULL;
     
        *ptrfic=ajouterentete(ptrfic);
     
        if(ptrfic==NULL)
        puts("liste vide");
        else{
        puts(ptrfic->nom);
        printf("%d",ptrfic->x);
        }
        sp;
        system("pause");
     
     
    }
     
    fic ajouterentete(fic *ptrfic)
    {
        fic *newptr=malloc(sizeof(fic));
     
        char nom[a];
        int x;
        puts("Notez votre nom:");
        gets(nom);
        puts("age:");
        scanf("%d",&x);
        newptr->x=x;
        *newptr->nom=(char)malloc((strlen(nom)+1)*sizeof(char));
        strcpy(newptr->nom,nom);
        newptr->svt=ptrfic;
        return *newptr;
    }
    Alors, j'essaie tant bien que mal d'afficher mes obtentions, mais ca plante a chaque fois. Si quelqu'un voit une solution, ce serait super !

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Salut,

    petite question : à quoi servent le champ "pcd" et la variable "tmp"?

    Sinon ton plantage vient de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *ptrfic=ajouterentete(ptrfic);
    En effet tu n'as pas alloué d'espace pour la variable à laquelle tu souhaites assigner une valeur.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    ps : juste pour préciser, si tu alloues de la mémoire pour ptrfic, ça ne plantera plus et tu auras même un comportement cohérent avec ce qui est attendu dans ton main (compte tenu du fait que tu n'ajoutes et ne vérifies qu'un seul élément)
    Pour autant la fonction "ajouterentete" n'a pas l'air très au point, essaye d'ajouter plusieurs éléments et tu devrais être fixé..

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fic ajouterentete(fic *ptrfic)
    Va faire une copie d'un maillon dans ce cas la,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fic *newptr=malloc(sizeof(fic));
    ne sert à rien, et tu auras une fuite de mémoire.

    Il vaut mieux faire fic * ajouterentete(fic *ptrfic) et dans ce cas là, tu fera une copie du pointeur. C'est plus rapide, plus léger et en plus tu n'as plus de problème de SEGFAULT.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diablo9 Voir le message
    Voici les codes de mon programme d'ajout d'information en tête dans ma liste chaînée:
    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
    #define a 100
    #define sp printf("\n")
    typedef struct fic
    {
        char nom[a];
        int x;
        struct fic *svt;
        struct fic *pcd;
    }fic;
    
    fic ajouterentete(fic*);
    
    void main(void)
    {
        fic *ptrfic=NULL,*tmp=NULL;
    
        *ptrfic=ajouterentete(ptrfic);
        // Ok, ici tu remplis le pointé et non le pointeur.
    
        if(ptrfic==NULL)
        puts("liste vide");
        else{
        puts(ptrfic->nom);
        printf("%d",ptrfic->x);
        }
        sp;
        system("pause");
    
    
    }
    
    fic ajouterentete(fic *ptrfic)
    {
        fic *newptr=malloc(sizeof(fic));
    
        char nom[a];
        int x;
        puts("Notez votre nom:");
        gets(nom);
        puts("age:");
        scanf("%d",&x);
        newptr->x=x;
        *newptr->nom=(char)malloc((strlen(nom)+1)*sizeof(char));
        // Pourquoi une étoile ici ? Qu'y a-t-il de différent entre "je mets une valeur x dans un champ" et "je mets une valeur adresse dans un autre" ? De plus nom est un tableau de [100] et pas un pointeur !!!
    
        strcpy(newptr->nom,nom);
        newptr->svt=ptrfic;
        // Ok, donc tu prends l'argent que tu mets dans la poche droite. Puis tu le passes dans la poche gauche puis tu le tends au marchand. Pourquoi passer par des variables intermédiaires ???
    
    
        return *newptr;
        // Ici tu ne renvoies qu'une copie de ton maillon (comme le dit Neckara) alors qu'il faudrait renvoyer l'adresse...
    }
    Alors, j'essaie tant bien que mal d'afficher mes obtentions, mais ca plante a chaque fois. Si quelqu'un voit une solution, ce serait super!
    Salut

    Ca compile ça ??? T'as pas ne serait-ce qu'un warning ???
    Va voir les commentaires dans ton code. Ensuite, voici un code équivalent mais écrit proprement et qui fonctionne.
    Code c : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define a 100
    #define sp printf("\n")
    typedef struct s_fic
    {
        char nom[a];
        int x;
        struct s_fic *svt;
        struct s_fic *pcd;
    }t_fic;
     
    t_fic *ajouterentete(t_fic*);
     
    void main(void)
    {
        t_fic *ptrfic=NULL,*tmp=NULL;
     
        ptrfic=ajouterentete(ptrfic);
     
        if(ptrfic==NULL)
        puts("liste vide");
        else{
        puts(ptrfic->nom);
        printf("%d",ptrfic->x);
        }
        sp;
    }
     
    t_fic *ajouterentete(t_fic *ptrfic)
    {
        t_fic *newptr=malloc(sizeof(t_fic));
     
        puts("Notez votre nom:");
        gets(newptr->nom);
        puts("age:");
        scanf("%d",&newptr->x);
        newptr->svt=ptrfic;
        return newptr;
    }

    Ensuite quand tu auras un peu plus l'expérience des listes chainées, tu te rendras compte qu'il est plus pratique de créer une structure dédiée à la liste elle-même. Par exemple ceci
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct {
        t_fic *first;
    } t_liste;
    Ca peut paraitre idiot de créer un type ne contenant qu'un élément mais ensuite on peut facilement en rajouter d'autres comme par exemple le nombre de maillons, le dernier maillon, le maillon courant, etc. C'est comme les chemises. On peut les tenir par le col mais c'est plus pratique quand on les met sur un cintre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Par défaut Ça marche
    Merci les gars!
    En effet maintenant que que j'ai ajouté une étoile a l'entête de ma fonction, tout va mieux

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diablo9 Voir le message
    En effet maintenant que que j'ai ajouté une étoile a l’entête de ma fonction, tout va mieux
    Euh oui enfin j'espère que tu n'as pas fait que ça comme modif et surtout que tu as compris les fondamentaux de ce topic...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Problème affichage d'une liste chainée
    Par Nardjesse dans le forum Débuter
    Réponses: 8
    Dernier message: 06/01/2013, 11h51
  2. Problème d'affichage avec une liste à puces
    Par Maxence45 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 09/07/2007, 21h09
  3. Problème d'affichage d'une liste déroulante sous IE
    Par devdebutante dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 09/07/2007, 15h29
  4. [MySQL] problème d'affichage dans une liste
    Par bromlecornu dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/05/2007, 16h08
  5. Problème d'affichage d'une liste déroulante
    Par licorne dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 05/09/2006, 13h07

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