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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    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 chevronné

    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
    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
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell

    N'oubliez pas de consulter les FAQ Swift, Android
    Tutoriel : Développer une application multilingue sous iOS

  3. #3
    Expert confirmé
    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
    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 chevronné

    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
    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?
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell

    N'oubliez pas de consulter les FAQ Swift, Android
    Tutoriel : Développer une application multilingue sous iOS

  5. #5
    Expert confirmé
    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
    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
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    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)

+ 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