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 :

Pointeur sur List


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 73
    Points
    73
    Par défaut Pointeur sur List
    Bonjour,
    Dans une unité j'ai un pointeur sur une Liste :TList *list;
    Dans cette même unité j'ai des fonctions qui permettent d'ajouter/insérer/supprimer des éléments dans cette liste :
    ex: insert(list,Objet);

    Je souhaiterais maintenant créer deux unités.
    Dans chacune des unités je voudrais stocker une liste TList.
    Je déclare donc TList *liste1; dans le 1ère et TList *liste2; dans la seconde. Chaque liste sera accessible via les mêmes fonctions définies dans la 1ère unité.

    Comment doit-je modifier la 1ère unité pour pouvoir écrire dans Liste1 ou Liste2?
    La liste ne sera plus stockée dans la 1ère unité mais alternativement dans liste1 ou list2
    J'espère que j'ai été assez claire dans mes explications.

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Non, ce n'est pas clair du tout. Qu'appelles-tu "unité" : unité de compilation ? Si c'est ça donne nous la liste de tes .h et de tes .c et ce qu'ils contiennent (en gros).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 73
    Points
    73
    Par défaut
    Voici une version réduite de unit1.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
     
    typedef struct _list_item
    {
       const char *name;
       const char *label;
    } list_item;
     
    TList *list; //Déclaration à changer 
     
    void append_item(const char *name, const char *label)
    {
         list_item *item = calloc(1, sizeof(list_item));
         list_item->name = strdup(name);
         list_item->label = strdup(label);
         list = list_append(list,item);
    }
    unit1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         void append_item(const char *name, const char *label);
         void select_list(TList *new_list);//fonction à implémenter
    unit2.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include unit1.h
     
    TList *list1;
     
    void show()
    {
           select_list(list1);//fonction à implémenter dans unit1.c
           append_item("First Name List1","First label List1");
    }
    unit3.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include unit1.h
     
    TList *list2;
     
    void show()
    {
           select_list(list2);//fonction à implémenter dans unit1.c
           append_item("First Name List2","First label List2");
    }

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 73
    Points
    73
    Par défaut
    Finalement j'ai trouvé, je passe le pointeur sur la liste par adresse et voici le code modifié:

    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
    typedef struct _list_item
    {
       const char *name;
       const char *label;
    } list_item;
    
    TList **list; //Déclaration d'un pointeur sur pointeur 
    
    void append_item(const char *name, const char *label)
    {
         list_item *item = calloc(1, sizeof(list_item));
         list_item->name = strdup(name);
         list_item->label = strdup(label);
         *list = list_append(*list,item);
    }
    void select_list(TList **new_list)
    {
        list=new_list;
    }
    unit1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         void append_item(const char *name, const char *label);
         void select_list(TList **new_list);
    unit2.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include unit1.h
    
    TList *list1;
    
    void show()
    {
           select_list(&list1);//Passage de l'adresse de la liste
           append_item("First Name List1","First label List1");
    }
    unit3.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include unit1.h
    
    TList *list2;
    
    void show()
    {
           select_list(&list2);//Passage de l'adresse de la liste
           append_item("First Name List2","First label List2");
    }

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Une question bête : pourquoi maintenir une variable globale sur la liste en cours ? Pourquoi ne pas passer la liste aux fonctions concernées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void append_item(TList*,const char *name, const char *label);
    ...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 73
    Points
    73
    Par défaut
    Dans le programme d'origine c'est fait comma ça. Je respecte sa structure. La liste est utilisée dans beaucoup d'autres procédures.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    J'y voit un risque en utilisant une telle variable globale de contexte de t'emmêler à un moment entre la liste courante et celle que tu veux modifier. A mon sens, ton code est dangereux sous cet aspect. Après, je comprend qu'on ne te donne pas forcément le temps de refactorer le tout

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 73
    Points
    73
    Par défaut
    Tu as sans doute raison. Je vais voir pour changer toutes mes procédures d'accès à la liste, ça évitera des problèmes plus tard.

Discussions similaires

  1. pointeurs sur liste
    Par gbsatti dans le forum Débuter
    Réponses: 1
    Dernier message: 17/04/2011, 23h11
  2. Pointeur sur un élément d'une liste
    Par azerty25 dans le forum Général Python
    Réponses: 3
    Dernier message: 18/11/2007, 12h44
  3. trier une liste de pointeurs sur personne
    Par italiasky dans le forum SL & STL
    Réponses: 5
    Dernier message: 10/11/2007, 14h53
  4. [Débutant] Pointeur sur liste chainée
    Par HaTnuX dans le forum C
    Réponses: 2
    Dernier message: 02/12/2006, 17h53
  5. fuite de memoire dans une liste de pointeur sur composant
    Par Nicolos_A dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/12/2004, 08h46

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