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 :

Désallocation d'un pointeur de pointeur par une fonction.


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 33
    Points
    33
    Par défaut Désallocation d'un pointeur de pointeur par une fonction.
    Bonjour à tous. Pour commencer ce post sur la désallocation de pointeur de pointeur j'ai écrit cette structure:

    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 avion{
        int Num;
        int max;
        char depart[20];
        char arrivee[20];
        char Hdepart[6];
        char Harrivee[6];
        Passager *PS;
        int NR;
        Passager *PF;
        struct avion *Suiv;
        struct avion *Prec;
    }Vol;
    J'ai préalablement fait plusieurs fonctions avec cette structure et à présent je voudrais faire un free des deux variables pointeurs PS et PF par cette 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
    void vider_passager (Passager **liste_p)
    {
        Passager *tmp;
        tmp=*liste_p;
        if ((*liste_p)->suiv==*liste_p)
        {
            free(liste_p);
        }
        else
        {
            while ((*liste_p)->suiv!=(*liste_p))
            {
                free(tmp);
                *liste_p=(*liste_p)->suiv;
                tmp=*liste_p;
            }
            free(liste_p);
        }
    }
    Je voudrais me resservir de cette fonction pour faire des free de PS et PF.
    J'ai essayé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            vider_passager ((&liste_v)->PS);
            vider_passager ((&liste_v)->PF);
    mais j'ai le message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error: request for member 'PS' in something not a structure or union
    error: request for member 'PF' in something not a structure or union
    Comment dois je faire pour régler ça svp ?

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur mobile iOS / Android
    Inscrit en
    Décembre 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur mobile iOS / Android
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 259
    Points : 690
    Points
    690
    Par défaut
    Bonjour,

    Il y a des lignes de codes incompréhensibles au niveau de ta conception:

    1 - On voit des actions de désallocation de mémoire (free) alors qu'on ne voit pas à quel moment tu fait on allocation de mémoire (malloc ou calloc). Tu aurais pu les poster si c'était fait.

    2 - Il faut savoir que l'utilisation de la fonction free va de paire avec les fonction malloc ou calloc. Voici un lien sur l'allocation dynamique en C

    3 - Dans ton structure on y trouve en même des variables pointeurs, et des variables simples (est ce que cela est faisable en C?, personnellement je ne sais pas)

    4 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void vider_passager (Passager **liste_p)
    tu veux accéder ici à un champ de ton structure. La synthaxe n'est pas correct. Il faut préciser à quel structure il appartient.

    voici un lien tuto sur la notion des pointeur et aussi un autre sur les structures

    Bon courage

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    @Seelass
    3 - Dans ton structure on y trouve en même des variables pointeurs, et des variables simples (est ce que cela est faisable en C?, personnellement je ne sais pas)
    Heureusement que c'est possible. Un pointeur est une variable comme une autre. La seule restriction sur les membres d'une structure est que la taille des membres doit être connue au moment de sa définition. Ceci exclut donc l'auto-inclusion de la structure, les VLA du C99 et les membres dont le type est incomplet (avec l'exception qu'un tableau dont la taille n'est pas spécifiée doit être le dernier (mais pas le premier) membre d'une structure (flexible array))

    @sweet live
    Pour être précis, il faudrait avoir le type de liste_v dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vider_passager ((&liste_v)->PS);
    Pour jouer aux devinettes, ce code impose que liste_v soit un Vol pour que &liste_v soit un Vol * et que (&liste_v)->PS ait un sens (C'est alors la même chose que liste_v.PS). Mais dans ce cas, (&liste_v)->PS est un Passager, pas un Passager **

    Pour que l'argument soit un Passager **, on peut supposer qu'il doit être de la forme &X où X est un Passager*, donc peut être de la forme liste_v->PS et dans ce cas liste_v doit être un Vol*.
    L'expression est donc (peut-être)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vider_passager (&liste_v->PS);

  4. #4
    Membre éclairé

    Homme Profil pro
    Développeur mobile iOS / Android
    Inscrit en
    Décembre 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur mobile iOS / Android
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 259
    Points : 690
    Points
    690
    Par défaut
    @diogene

    Merci pour l'information, dans ce cas en partant de l'exemple du modèle de structure de ce poste
    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 avion{
        int Num;
        int max;
        char depart[20];
        char arrivee[20];
        char Hdepart[6];
        char Harrivee[6];
        Passager *PS;
        int NR;
        Passager *PF;
        struct avion *Suiv;
        struct avion *Prec;
    }Vol;
    comment accéde t-on donc au champ Passager *PS?

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Comme pour les autres membres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vol s;
    Vol * ps = &s;
    s.PS = ...               // via la structure
    ps->PS = ...           // via un pointeur sur la structure

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Bonsoir à tous,

    Alors pour vous répondre liste_v est de type Vol *, tous les malloc on été fait et j'ai testé

    vider_passager (&liste_v->PS) qui me met exactement le même erreur que pour vider_passager ((&liste_v)->PS)

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Petit ajout, la liste_p est de type Passager *

    avec comme structure:

    typedef struct pass
    {
    int NPass;
    char NomP [20];
    int NumP;
    struct pass *suiv;
    struct pass *prec;
    } Passager;

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Soit plus précis, que veux-tu dire par
    Petit ajout, la liste_p est de type Passager *
    alors que le code posté dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void vider_passager (Passager **liste_p)
    ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Dans void vider_passager (Passager **liste_p) je prend un argument de type pointeur qui sera un pointeur de liste_p pour pouvoir le modifié et liste_p est un pointeur avec une structure Passager.

  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Rien compris à ce que tu dis.

    Le plus simple serait encore que tu montres le code

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Tout est la, les deux structures:
    - *liste_p qui a une structure Passager
    -*liste_v qui a une structure Vol

    La foncton viod y est est présente aussi. Elle permet de faire des free pour structure de type Passager. Je suis obligé de rajouter un pointeur sur l'argument à donnée à la fonction void car si je laisse seulement qu'une étoile les changements ne seront pas fait car la fonction fait des copies des variables. Alors je met un pointeur sur sur *liste_p qui est un pointeur sur une structure de type Passager.

    Ma question est qu'est-ce que je dois écrire comme argument quand j'appelle la fonction pour faire un free d'une liste_p qui se trouve dans une structure Vol, ici liste_v.

    C'est mieux expliqué comme ça ?

  12. #12
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ma question est qu'est-ce que je dois écrire comme argument quand j'appelle la fonction pour faire un free d'une liste_p qui se trouve dans une structure Vol, ici liste_v.
    Si je comprend ce que tu veux, la réponse a été donnée il y a deux jours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vider_passager (&liste_v->PS);
    Un code simplifié indicatif pour mettre cela en évidence (si la question a été mal comprise, tu pourrais t'en inspirer pour faire comprendre ce que tu veux)
    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
    #include <stdlib.h>
    //----------------------------------------------------------
    typedef struct pass
    {
      int NPass;
    } Passager;
     
    typedef struct avion
    {
        Passager *PS;
        Passager *PF;
    }Vol;
     
    void vider_passager (Passager **liste_p)
    {
      if(liste_p != NULL)
      {
         free(*liste_p);
         *liste_p = NULL;
      }
    }
     
    int main(void)
    {
      Vol liste ={NULL, NULL};
      Vol * liste_v = &liste;
      liste_v->PS = malloc( 10*sizeof(Passager));
      liste_v->PF = malloc( 5*sizeof(Passager));
      //.......
      vider_passager(&liste_v->PS);
      vider_passager(&liste_v->PF);
      return 0;
    }

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Justement le problème est que j'ai déjà essayé cette solution et ça ne fonctionne pas.

  14. #14
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Est-ce que le code exemple que j'ai donné est une illustration correcte de la situation dans ton code ? Si oui, présente t-il le même défaut que ton code ?

    On perd notre temps tant que tu ne montreras pas le code en question compilable et présentant le défaut.
    Le code peut être simplifié mais doit présenter le même problème, sinon on parle en l'air

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/02/2010, 13h49
  2. retour de pointeur par une fonction
    Par Miko95 dans le forum C++
    Réponses: 17
    Dernier message: 12/12/2007, 01h33
  3. Passer un pointeur en paramètre d'une fonction
    Par oranoutan dans le forum C
    Réponses: 18
    Dernier message: 11/09/2007, 21h48
  4. Réponses: 11
    Dernier message: 06/09/2007, 17h09
  5. Réponses: 14
    Dernier message: 07/06/2007, 19h40

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