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 de pointeur de pointeur et liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Par défaut probleme de pointeur de pointeur et liste chainée
    bonjour,

    j'essaye de gerer une file doublement chainée, j'ai utilisé le code de la chaine dans la FAQ de développez:
    http://nicolasj.developpez.com/articles/file/

    elle utilise les pointeurs de pointeurs et elle marche tres bien, jusque la tout va bien ...
    ensuite je voulu créer une fonction pour ajouter des elements automatiquement à la liste en fonction des resultats d'une base de données et c'est la que ca se complique...
    dans mon main() ,j'ai donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    queue_s *p_queue = NULL;
     
    queue_createFromDB(&p_queue); 
     
    queue_print (&p_queue);// affichage de ma file
    j'utilise un pointeur de pointeur pour manier la file
    voici la fonction que j'ai créer:

    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
     
     
    //creer la liste a partir de la BDD
    void  queue_createFromDB(queue_s ** pp_queue)
    {
    queue_s * tmp=NULL;   //creation d'un pointeur de liste temporaire
     
    //...connexion BDD + requete+creation d'une struct "rule"...
    //pour chaque "rule" créée, faire:
    {
           queue_post (&tmp, &p_rule);//ajouter un element a la file , ici un pointeur de pointeur d'une structure 'rule' que g créé plus haut
    }
     
    queue_print (&tmp);// affichage de ma file
     
    *pp_queue =tmp; // je donne l'adresse à mon veritable pointeur de file
    }

    le probleme c'est quand j'affiche la liste dans la fonction elle apparait bien, mais quand je l'affiche dans mon main() j'ai pas du tout le meme resultat et g des chiffres bizarres qui s'affichent.
    je pense avoir un probleme de pointeurs qq part ,j'ai encore des lacunes sur ce sujet, j'en suis bien conscient et j'ai passer plusieurs heures à essayer de comprendre mes erreurs , j'ai essayé plusieurs alternatives mais rien y fait. pourriez vous m'eclairer svp ?

    j'espere que j'ai bien expliqué le prob...

    merci

  2. #2
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Essayer de regarder le code à l'intérieur de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //...connexion BDD + requete+creation d'une struct "rule"...
    //pour chaque "rule" créée, faire:
    {
           queue_post (&tmp, &p_rule);//ajouter un element a la file , ici un pointeur de pointeur d'une structure 'rule' que g créé plus haut
    }
    dans la connection au SGBD au niveau de la création/allocation des p_rule.

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Par défaut
    salut mchk0123

    je ne pense pas que ca vienne de là puisque à la fin de ma fonction quand je fais un print de ma file , elle apparait comme je veux, les insertions se sont bien passées mais c'est apres qd je reviens dans le main() que ce n'est plus la meme chose.

  4. #4
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Citation Envoyé par iznogoud36
    je ne pense pas que ca vienne de là puisque à la fin de ma fonction quand je fais un print de ma file , elle apparait comme je veux, les insertions se sont bien passées mais c'est apres qd je reviens dans le main() que ce n'est plus la meme chose.
    Pour ma part je ne vois que là, en tout cas le code que tu as envoyé m'a l'air bon ... Si tu pouvais mettre le code concernant la déclaration de type de p_rule et toutes les allocations/affectations/utilisation cela m'aiderais, car :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //ici un pointeur de pointeur d'une structure 'rule' que g créé plus haut
    C'est vachement vague ...

  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
    d'abord pourquoi passer par un pointeur intermédiaire ??

    tu n'as pas besoin du tmp, tu peux directement passer ton pointeur, puisque ce n'est pas dans cette routine que tu fais l'allocation.

    D'autre part, dand ton queue-print, aucun besoin de passer un pointeur de pointeur, puisque tu ne vas pas modifier le pointeur.

    Enfin, comme a dit mchk1023, le code à l'intérieur de queue_post risque d'avoir quelque chose qui ne vas pas..

    Pas un moyen d'en avoir une version abrégée ?

  6. #6
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Par défaut
    voici mon code test pour créer une regle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      rule_s *p_rule = NULL;
      p_rule = rule_new();
      unsigned int test0 = 44;
      unsigned int ruleType = 0;
      rule_create( &p_rule ,&ruleType, &test );
    ma fonction pour créer une struct 'rule'
    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
     
     
    //creer une regle de bienvenue
    void rule_create (rule_s ** pp_rule,unsigned int *ruleType, unsigned int *user_Id)
    {
       if (pp_rule != NULL)
       {
          rule_s *p_p = NULL;
          p_p = malloc (sizeof (*p_p));
          if (p_p != NULL)
          {
             p_p->user_Id = user_Id;
             p_p->ruleType = ruleType;
             *pp_rule = p_p;
     
          }
          else
          {
             fprintf (stderr, "Memoire insuffisante\n");
             exit (EXIT_FAILURE);
          }
       }
       return;
    }
    et la ma fonction post qui ajoute une 'rule' a la file

    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
     
     
     
    //ajouter un element au debut de la file
    void queue_post (queue_s ** pp_queue, rule_s ** pp_rule)
    {
     
       if (pp_queue != NULL)
       {
          queue_s *p_l = NULL;
          queue_s *p_p = NULL;
     
          queue_first (pp_queue);
          p_l = *pp_queue;
          p_p = malloc (sizeof (*p_p));
          if (p_p != NULL)
          {
             p_p->rule = *pp_rule;
             p_p->next = p_l;
             p_p->prev = NULL;
             if (p_l != NULL)
                p_l->prev = p_p;
             *pp_queue = p_p;
     
          }
          else
          {
             fprintf (stderr, "Memoire insuffisante\n");
             exit (EXIT_FAILURE);
          }
       }
       return;
    }
    et finalement la fonction print qui affiche la file
    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
     
    //imprimer toute la file
    void queue_print (queue_s **pp_q)
    {
      queue_first (pp_q);
       printf("->|");
     
    if (pp_q != NULL && *pp_q != NULL)
        {
     
        while ((*pp_q)->next != NULL)
            {
                printf (" %u |", *(*pp_q)->rule->user_Id);
                queue_next (pp_q);
            }
     
        //dernier element de la file
        printf (" %u |->\n", *(*pp_q)->rule->user_Id);
     
     
        queue_first (pp_q);
     
        }else{
     
            printf("error");
     
        }
       return;
    }
    merci

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/11/2007, 18h59
  2. Réponses: 6
    Dernier message: 26/05/2007, 00h33
  3. Réponses: 2
    Dernier message: 11/04/2007, 22h34
  4. Réponses: 1
    Dernier message: 16/06/2006, 16h12
  5. Réponses: 2
    Dernier message: 10/10/2005, 02h25

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