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 :

Charger une liste chaine double à partir d'un fichier texte


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Charger une liste chaine double à partir d'un fichier texte
    Salut j'ai un tp dans lequel je dois charger une liste doublement chainée à partir d'un fichier texte.
    La compilation est parfaite mais l'exécution ne fonctionne pas en fait une alerte m'annonce L'instruction à "0x********" emploie l'adresse mémoire "0x00000000". La mémoire ne peut pas être 'read'

    aidez-moi s'il vous plai t
    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
    void charger_liste(LISTE **first,FILE *f)
    {
        LISTE *last,*p;
        int l=0;
        char s[100];
     
        while (fgets(s,100,f))
        {
            last=get_last(*first);
            p= (LISTE *)malloc(sizeof(LISTE));
            p->prev=last;
            (p->d).ligne=l++;
            p->next=NULL;
            (p->d).s= (char*)malloc ((strlen(s)+1)*sizeof(char));
            strcpy((p->d).s,s);
            if (last==NULL)
                *first=p;
            last->next=p;
        }
    }
     
    LISTE* get_last(LISTE *first)
    {
        if (first == NULL)
            return NULL;
        while(first->next != NULL)
        {
            first = first->next;
        }
        return first;
    }
     
    void view_liste (LISTE *first)
    {
        for (; first; first=first->next)
            printf("%d",(first->d).ligne);
        printf(" \n %s",(first->d).s);
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pour ce qui est de la compilation, on ne peut pas vérifier car tu ne nous as pas donné un code compilable : il manque la définition de LISTE.

    Mais à vue de nez, on peut dire qu'il y a au moins un problème : tu utiliser get_last() avant de la définir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        for (; first; first=first->next)
            printf("%d",(first->d).ligne);
    Cela s'écrirait peut-être plus clairement avec un while.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par yedez Voir le message
    L'instruction à "0x********" emploie l'adresse mémoire "0x00000000". La mémoire ne peut pas être 'read'
    C'est pourtant très explicite: Tu tentes de lire un pointeur nul.

    Par contre, je ne vois pas d'erreur flagrante dans le code que tu as posté. L'erreur vient peut-être du code appelant.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il est possible que cela provienne de la ligne 18 :
    Si last est NULL, on ne peut pas accéder au champ next.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, je dirais qu'il manque un else.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    je ne comprends toujours pas l'erreur mai bon je vais vous donner tout mon code source peut être l'erreur s'agit bien d'une autre fonction
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    struct data
    {
        char *s;
        int ligne;
    };
    typedef struct data DATA;
     
     
    struct liste
    {
        DATA d;
        struct liste *next;
        struct liste *prev;
    };
    typedef struct liste LISTE;
     
    void charger_liste(LISTE **first,FILE *f);
    int open_files(FILE **f);
    void view_liste(LISTE *first);
    void print_data(DATA d);
    void view_ligne(LISTE* first);
    LISTE* get_last(LISTE *first);
    void main()
    {
        FILE *f;
        int option;
        LISTE *first;
         if(!open_files(&f))
        exit(0);
     
        while (option=get_option()!=0)
        {
            switch(option)
            {
            case 1:
                charger_liste (first,f);
                break;
           case 2:
                view_liste(first);
               break;
           case 3:
            view_ligne(first);
            break;
     
            }
        }
        fclose(f);
    }
     int get_option()
     {
         int p;
         printf("1* charger votre liste\n2* afficher le contenu de la liste\n3* afficher le contenu de la ligne n1 et n2 \n");
         printf("4* effacer la ligne de numero donne\n5* effacer les lignes vides\n6* effacer un bloc de n lignes \n");
         printf("7* afficher les lignes indiques \n8* inserer une nouvelle ligne\n9* remplacer les sous chaines par des autres\n");
         printf ("10* sauvegarder la liste \n");
         scanf("%d",p);
         return(p);
     }
     
    int open_files(FILE **f)
    {
      *f=fopen("programmation.txt","a+");
      if(*f==NULL)
      {
        printf("Erreur D'ouverture Fichier programmation.txt");
        return(0);
      }
    }
     
     void charger_liste(LISTE **first,FILE *f)
     {
         LISTE *last,*p;
         int l=0;char s[100];
     
         while (fgets(s,100,f))
         {
     
         last=get_last(*first);
         p= (LISTE *)malloc(sizeof(LISTE));
         p->prev=last;
        (p->d).ligne=l++;
         p->next=NULL;
        (p->d).s= (char*)malloc ((strlen(s)+1)*sizeof(char));
        strcpy((p->d).s,s);
        if (last==NULL)
                *first=p;
        last->next=p;
         }
     }
     
    LISTE* get_last(LISTE *first)
    {
    if (first == NULL)
        return NULL;
    while(first->next != NULL)
    {
     
        first = first->next;
    }
    return first;
    }
     
    void view_liste (LISTE *first)
    {
        for (;first;first=first->next)
            printf("%d",(first->d).ligne);
            printf(" \n %s",(first->d).s);
    }
     
    void view_ligne(LISTE *first)
    {
        int l1,l2;
        printf("donner les lignes a visualiser");
        scanf("%d %d",&l1,&l2);
        while (((first->d).ligne==l1)&&((first->d).ligne==l2))
        {
            printf("%s",(first->d).s);
        }
    }

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Quand je compile, j'obtiens plein de warnings :
    gcc -Wall -Wextra test.c 
    test.c:28:6: warning: return type of 'main' is not 'int' [-Wmain]
     void main()
          ^
    test.c: In function 'main':
    test.c:36:5: warning: implicit declaration of function 'get_option' [-Wimplicit-function-declaration]
         while (option=get_option()!=0)
         ^
    test.c:36:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
    test.c:41:13: warning: passing argument 1 of 'charger_liste' from incompatible pointer type [enabled by default]
                 charger_liste (first,f);
                 ^
    test.c:22:6: note: expected 'struct LISTE **' but argument is of type 'struct LISTE *'
     void charger_liste(LISTE **first,FILE *f);
          ^
    test.c: In function 'get_option':
    test.c:61:6: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
          scanf("%d",p);
          ^
    test.c:61:6: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]
    test.c: In function 'open_files':
    test.c:73:1: warning: control reaches end of non-void function [-Wreturn-type]
     }
     ^
    test.c: In function 'get_option':
    test.c:61:11: warning: 'p' is used uninitialized in this function [-Wuninitialized]
          scanf("%d",p);
               ^
    test.c: In function 'main':
    test.c:41:27: warning: 'first' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 charger_liste (first,f);
                               ^
    Quel compilateur utilises-tu ? Quelles options lui passes-tu ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Avant de reprendre l'erreur déjà citée, il serait bon de corriger tout ces avertissements signalés par Bktero.
    Comme d'habitude, ce n'est pas tout d'avoir une code qui compile, et d'avoir je ne sais combien d'avertissements derrière.
    Les avertissements signalent dans la grandes majorité des cas des erreurs qui auront lieu pendant l'exécution ! Donc prend l'habitude de ne pas en laisser, à moins d'être sûr de toi.

    Pour revenir notre l'erreur, ta variable last a la possibilité d'être nulle, étant donnée que tu fais :
    et étant donné que la fonction get_last() (en un peu mieux indenté):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LISTE* get_last(LISTE *first)
    {
        if (first == NULL)
            return NULL;
        while(first->next != NULL)
        {     
            first = first->next;
        }
        return first;
    }
    peut retourner NULL.
    Or dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if (last==NULL)
            *first=p;
        last->next=p;
    Tu vérifies d'abord si last est nulle, et exécutes *first=p; le cas échéant, mais dans tous les cas tu exécutes la ligne suivante : last->next=p;.
    Comme l'a suggéré Medinoc, il me semble aussi qu'il te manque un else entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (last==NULL)
            *first=p;
        else
            last->next=p;

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    code:blocks

Discussions similaires

  1. Réponses: 19
    Dernier message: 07/02/2015, 19h30
  2. Réponses: 2
    Dernier message: 20/10/2012, 22h07
  3. Réponses: 3
    Dernier message: 16/07/2009, 18h00
  4. Réponses: 2
    Dernier message: 22/05/2009, 15h06
  5. Réponses: 4
    Dernier message: 14/10/2003, 08h58

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