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 :

Probleme liste chainée


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Par défaut Probleme liste chainée
    Bonjour,

    Cela fait maintenant une semaine que je me prends la tête sur ce probleme et je ne comprends toujours pas ! Explications:

    Je créé un liste doublement chainée avec comme structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct  s_env
    {
      char          *value;
      struct s_env  *next;
      struct s_env  *previous;
    }               t_env;
     
    typedef struct  s_limit_env
    {
      t_env         *start;
      t_env         *end;
    }               t_limit_env;
    Puis j'ajoute mes données dedans avec:

    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
    void    create_list_env(t_limit_env *limit_env, char *value)
    {
      t_env *env;
     
      env = malloc(sizeof(*env));
      if (!env)
        gest_error(4);
      env->value = value;
      env->next = NULL;
      env->previous = limit_env->end;
      if (limit_env->end)
        limit_env->end->next = env;
      else
        limit_env->start = env;
      limit_env->end = env;
    }
    Jusque là tout va bien !!

    Ensuite vient ma fonction d'affichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void    aff_env(t_limit_env *limit_env)
    {
      t_env *env;
     
      env = limit_env->start;
      while (env)
        {
          my_putstr(env->value);
          my_putchar('\n');
          env = env->next;
        }
    }
    Par contre ici il m'affiche n'importe quoi !!
    Par exemple je créé une liste de 3 éléments avec en value pour la liste 1 "TOTO", la liste 2 "TATA" et la liste 3 "TUTU",
    à l'affichage il m'affichera 3 fois "TUTU" !! Ou sont passé "TOTO" et "TATA" ????
    "value" est un char* mais lorsque je le met en int, et que je met des nombres à la place des "TOTO", "TATA", "TUTU" ca marche normalement !!
    Ma question est: Comment la faire marcher avec des char* ??

    Merci beaucoup beaucoup d'avance,

    Hugo

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    parce qu'il y a plein d'erreurs......


    • 1) une assignation de chaine en C ne se fait pas avec =, mais strcpy ou strdup.... Là tu ne fais que copier un pointeur..

    • 2) je ne sais pas ce que fait gesterror, mais si l'alllocation a échouée, ça a l'air que tu continues quand même à assigner les valeurs..

    • 3) les tests de pointeurs doivent être par rapport à NULL


    Un code correct serait plutô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
    void    create_list_env(t_limit_env *limit_env, char *value)
    {
      t_env *env=NULL;
    
      env = malloc(sizeof(t_env));
      if (env == NULL)
        gest_error(4);
      else
        {
          env->value = strdup(value) ;
          env->next = NULL;
          env->previous = limit_env->end;
          if (limit_env->end != NULL)
              limit_env->end->next = env;
          else
              limit_env->start = env;
          limit_env->end = env;
       }
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void    aff_env(t_limit_env *limit_env)
    {
      t_env *env=NULL;
    
      env = limit_env->start;
      while (env != NULL)
        {
          my_putstr(env->value);
          my_putchar('\n');
          env = env->next;
        }
    }
    et à la place de strdup tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    env->value = malloc ( (strlen(value)+1) );
    if ( env->value != NULL )
        strcpy ( env->value, value );

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    parce qu'il y a plein d'erreurs......


    • 1) une assignation de chaine en C ne se fait pas avec =, mais strcpy ou strdup.... Là tu ne fais que copier un pointeur..

    • 2) je ne sais pas ce que fait gesterror, mais si l'alllocation a échouée, ça a l'air que tu continues quand même à assigner les valeurs..

    • 3) les tests de pointeurs doivent être par rapport à NULL


    Un code correct serait plutô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
    void    create_list_env(t_limit_env *limit_env, char *value)
    {
      t_env *env=NULL;
    
      env = malloc(sizeof(t_env));
      if (env == NULL)
        gest_error(4);
      else
        {
          env->value = strdup(value) ;
          env->next = NULL;
          env->previous = limit_env->end;
          if (limit_env->end != NULL)
              limit_env->end->next = env;
          else
              limit_env->start = env;
          limit_env->end = env;
       }
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void    aff_env(t_limit_env *limit_env)
    {
      t_env *env=NULL;
    
      env = limit_env->start;
      while (env != NULL)
        {
          my_putstr(env->value);
          my_putchar('\n');
          env = env->next;
        }
    }
    et à la place de strdup tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    env->value = malloc ( (strlen(value)+1) );
    if ( env->value != NULL )
        strcpy ( env->value, value );
    En fait, quand j'ai lu son code, j'ai pensé que "value" était un pointeur déjà alloué par ailleurs (ce qui est parfaitement possible). Dans ce cas le code initial aurait fonctionné (cela aurait été une simple gestion de liste chainée de pointeurs). Mais c'est vrai que si "value" est ne serait-ce que l'adresse d'un champ de saisie ça ne peut que merder...

    Citation Envoyé par hugo1787 Voir le message
    "value" est un char* mais lorsque je le met en int, et que je met des nombres à la place des "TOTO", "TATA", "TUTU" ca marche normalement !!
    Ma question est: Comment la faire marcher avec des char* ??
    La vraie question est "que contient value lorsque tu le passes à ta fonction et que tu le stockes dans ta liste ?"

    PS: le problème soulevé dans ce topic n'est en rien lié à Linux. Il devrait être dans la cat. C...
    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]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Par défaut
    En fait je recupere mon environement avec "extern char **environ; " et je le decoupe grace a ca, c'est peut etre de la que vient mon erreur.

    Evidemment limit_env->start et limit_env->end sont initialises a NULL dans mon main.

    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
    void	get_env(t_limit_env *limit_env)
    {
      int	i;
      int	j;
      int	k;
      char	*var;
      char	*value;
      char	*envstr;
     
      var = malloc(sizeof(*var));
      value = malloc(sizeof(*value));
      envstr = malloc(sizeof(*envstr));
      if ((var == NULL) || (value == NULL))
        gest_error(1); //Dans le gest_error je fais un exit()
      i = 0;
      while (environ[i] != NULL)
        {
          j = 0;
          k = 0;
          envstr = strdup(environ[i]); //J'ai mis le strdup() mais ca marche sans aussi
          while (envstr[j] != '=') //Recuperation de la premiere partie de environ et stokage dans la variable var
    	{
    	  var[k] = envstr[j];
    	  j++;
    	  k++;
    	}
          var[k] = '\0';
          j++;
          k = 0;
          while (envstr[j] != '\0') //Recuperation de la seconde partie de environ et stockage dans la vaiable value
    	{
    	  value[k] = envstr[j];
    	  k++;
    	  j++;
    	}
          value[k] = '\0';
    //ici si je fais un printf("%s = %s",var, value) les variables contiennent bien ce que je veux soit des char*.
          create_list_env(limit_env,value,var);
          i++;
        }
    }

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et ton environ[i] , ou environ, tu l'obtiens comment ?

    ou est-il declare ?

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ahem ahem !!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          create_list_env(limit_env,var,value);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void    create_list_env(t_limit_env *limit_env, char *value, char *var)
    ya rien qui te chicotes la-dedans ????







    Note : inversion var et value

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Par défaut
    Heu lol non c'est moi quand j'ai refais le topic j'ai rajoute var ! Le code sur ma machine est a l'endroit !

    Le environ[i] je le recupere dans le ".h" avec "extern char **environ;".

    Merci !

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Deja je trouve que tu te compliques la vie :

    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
     
    void	get_env(t_limit_env *limit_env)
    {
      int	i;
      char	*var=NULL;
      char	*value=NULL;
      char	*p=NULL;
     
       i = 0;
      while (environ[i] != NULL)
        {
           if ( (p = strchr(environ[i], '=')) != NULL ) //Recuperation de la premiere partie de environ et stokage dans la variable var
           {
                *p = '\0' ;
                 var = strdup(environ[i]);
                 value = strdup(p+1);
                 *p = '=' ;
    //ici si je fais un printf("%s = %s",var, value) les variables contiennent bien ce que je veux soit des char*.
                 create_list_env(limit_env,value,var);
     
                 if ( value != NULL )
                    free(value);
                 if ( var != NULL )
                    free(var);
                 i++;
           }
        }
    }

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Par défaut
    It works !!

    Merci beaucoup Souviron34 !!

    Je devrais un peu plus lire les man...

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Deja je trouve que tu te compliques la vie :

    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
     
    void	get_env(t_limit_env *limit_env)
    {
      int	i;
      char	*var=NULL;
      char	*value=NULL;
      char	*p=NULL;
     
       i = 0;
      while (environ[i] != NULL)
        {
           if ( (p = strchr(environ[i], '=')) != NULL ) //Recuperation de la premiere partie de environ et stokage dans la variable var
           {
                *p = '\0' ;
                 var = strdup(environ[i]);
                 value = strdup(p+1);
                 *p = '=' ;
    //ici si je fais un printf("%s = %s",var, value) les variables contiennent bien ce que je veux soit des char*.
                 create_list_env(limit_env,value,var);
     
                 if ( value != NULL )
                    free(value);
                 if ( var != NULL )
                    free(var);
                 i++;
           }
        }
    }
    J'avais raison !!! Il ne stocke que des pointeurs déjà alloués par ailleurs

    Citation Envoyé par hugo1787 Voir le message
    It works !!
    N'oublie pas que tes pointeurs stockés ont été alloués par strdup(). Te faudra penser à les libérer (free()) une fois que t'en auras plus besoin...

    Citation Envoyé par hugo1787 Voir le message
    Je devrais un peu plus lire les man...
    Yep...
    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. probleme liste chainée
    Par KindPlayer dans le forum C
    Réponses: 6
    Dernier message: 24/05/2011, 10h49
  2. Probleme liste chainée
    Par Raton dans le forum C++
    Réponses: 8
    Dernier message: 15/11/2005, 19h25
  3. Probleme arbre/liste chainée en template
    Par Raton dans le forum Langage
    Réponses: 1
    Dernier message: 07/11/2005, 16h09
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  5. Réponses: 11
    Dernier message: 02/05/2005, 19h30

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