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 :

Liste chainées de chaine de charactères.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 5
    Par défaut Liste chainées de chaine de charactères.
    Bonjour,

    Je me suis décidé a aprofondir mes "connaissance" en C et donc je passe par les listes chainées et les structures de données.
    Jusqu'a présent j'arrive à remplir une liste d'entier et les afficher.
    J'ai donc voulu remplir une liste de mots et les afficher, la partie pour remplir une liste est opérationel, je pêche sur la partie affichage de la liste.
    J'ai le tristement célèbre "Segmentation Fault".
    C'est surrement une histoir de malloc, mais je ne sais pas ou le placer, j'ai essayer plusieurs solutions, malheureusement sans succès.
    Merci a ceux qui prendrons le temps de me lire et de m'aider !

    Le main.c
    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
    int                     main(int argc, char **argv)
    {
      struct termios        t;
      struct dlist          *word;
      int                   i;
     
      word = malloc(sizeof(struct dlist *));
      i = 2;
      tgetent(0, "xterm");
      raw_mode(&t);
      if (argc == 1)
        my_printf("error : please enter more arguments\n");
      else
        {
          if (word != NULL)
            {
              word->length = 0;
              word->p_head = NULL;
              word->p_tail = NULL;
            }
          dlist_add_first(word, my_get_nbr(argv[1]));
          while(i < argc)
            {
              dlist_add_last(word, my_get_nbr(argv[i]));
              i = i + 1;
            }
        }
      dlist_display(word);
      while (42);
      return (0);
    }
    Les fonctions pour remplire les listes et l'afficher.
    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
    dlist           *dlist_add_last(struct dlist *p_list, char *data)
    {
      struct node   *p_new;
     
      p_new = malloc(sizeof(struct node *));
      if (p_new != NULL)
        {
          p_new->data = data;
          p_new->p_next = NULL;
          if (p_list->p_tail == NULL)
            {
              p_new->p_prev = NULL;
              p_list->p_head = p_new;
              p_list->p_tail = p_new;
            }
          else
            {
              p_list->p_tail->p_next = p_new;
              p_new->p_prev = p_list->p_tail;
              p_list->p_tail = p_new;
            }
          p_list->length++;
        }
      return (p_list);
    }
     
    dlist           *dlist_add_first(struct dlist *p_list, char *data)
    {
      struct node   *p_new;
     
      p_new = malloc(sizeof(struct node *));
      if (p_new != NULL)
        {
          p_new->data = data;
          p_new->p_prev = NULL;
          if (p_list->p_tail == NULL)
            {
              p_new->p_next = NULL;
              p_list->p_head = p_new;
              p_list->p_tail = p_new;
            }
          else
            {
              p_list->p_head->p_prev = p_new;
              p_new->p_next = p_list->p_head;
              p_list->p_head = p_new;
            }
          p_list->length++;
        }
      return (p_list);
    }
     
    void            dlist_display(struct dlist *p_list)
    {
      struct node   *p_temp;
     
      p_temp = p_list->p_head;
      while (p_temp != NULL)
        {
          my_printf("%s ", p_temp->data);
          p_temp = p_temp->p_next;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct  node
    {
      char          *data;
      struct node   *p_next;
      struct node   *p_prev;
    }node;
     
    typedef struct dlist
    {
      size_t        length;
      struct node   *p_tail;
      struct node   *p_head;
    }dlist;
    Encor merci pour votre aide et votre temps !

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Sans trop approfondir ton code je vois ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct dlist *word;
     
    word = malloc(sizeof(char));
    Si word est du type dlist pourquoi alloues-tu un espace d'un seul char (1 octet) ? Il me semble que tu devrais allouer l'espace nécessaire pour contenir une donnée de la taille de dlist, non ?

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 5
    Par défaut
    Tu a raison, mon malloc etait faux, je l'est changer comme tu me l'as conseiller, mais cela ne résou pas mon "Segmentation Fault".
    Merci tout de même pour ton aide !

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    On continue alors dans la même lancée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     struct node   *p_new;
     
      p_new = malloc(sizeof(int));
    Même problème...

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 5
    Par défaut
    Ahah apres ton premier post j'ai pris le temps de corriger tout mes malloc, mais mon problème n'est toujours pas résolu, en faite je pense que l'erreur viens de quelque chose que je n'est pas faites.
    Peut etre dans ma fonction dlist_display..

    merci quand meme !

    PS : J'ai modifier mon code avec les malloc mis a jours, je pense que la ils sont bon, je débute en c et les histoires de malloc sont encor assez obscure.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Une seg fault n'intervient que dans deux cas:
    • quand on déréférence un pointeur libéré
    • et quand on déréférence un pointeur foireux tel que NULL, * ((int*) 17) ou simplement un pointeur non initialisé.


    Vérifie que tes pointeurs sont mis à NULL quand libérés.
    Vérifie que tes pointeurs ne sont jamais accédés quand ils sont nuls.

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Les fonctions dlist_add_first(); et dlist_add_last(); renvoient le pointeur du premier élément de la liste, enfin c'est ce qu'il faudrait. Mais lorsque tu les utilises tu ne le récupères pas. C'est une première chose à voir.

    Ensuite es-tu sûr de ce que te renvoie la fonction my_get_nbr(); ? Logiquement elle devrait renvoyer une allocation mémoire dans le tas du type char*. Est-ce le cas ?

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

Discussions similaires

  1. [AC-2007] Zone de liste dépend de liste déroulante et chaine de caractère
    Par vincent1746 dans le forum IHM
    Réponses: 4
    Dernier message: 11/05/2010, 14h12
  2. 3 liste déroulante en chaine qui se Masq/Démasq
    Par scoal dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/07/2009, 13h38
  3. pbm suppression list de paires <chaine, ensemble>
    Par tachaout dans le forum SL & STL
    Réponses: 3
    Dernier message: 08/03/2009, 17h52
  4. Réponses: 0
    Dernier message: 03/03/2009, 12h06

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