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 :

Une histoire de pointeurs


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 35
    Points : 7
    Points
    7
    Par défaut Une histoire de pointeurs
    Bien le bonjour/bonsoir,

    Je dispose de deux fonctions, que je vais vous donner ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    object_list * List_Cons(object * O, object_list * pHead)
    {
     
      /* allocation of a new cell in the heap */
      object_list * pNew = malloc(sizeof(object_list));
      pNew->obj = O; /* equivalent to (*new).object = p; */
      pNew->pNext = NULL;
     
      pNew->pNext = pHead;
      return pNew; 
    }
    et :

    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
    void Remove(object_list ** ppHead, object * O)
    {
      object_list * pH = *ppHead;
      if (pH->obj == O)
        {
          *ppHead = pH->pNext;
          free(pH);
          return;
        }
     
      while (pH->pNext->obj != O)
        {
          pH = pH->pNext;
        }
      object_list * tmp = pH->pNext;
      pH->pNext = pH->pNext->pNext;
      free(tmp);
    }
    Dans la première, la valeur retournée est de type object_list *, donc un simple pointeur sur une structure de liste simplement chaînée.
    Dans la seconde, la valeur prise en paramètre est de type object_list **.

    Je souhaiterai utiliser la valeur retournée dans la première, dans la seconde. De quelle façon procéder, puisqu'elles ne sont pas de même type.

    Merci d'avance de vos réponses!

    Cordialement.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        object dummy;
        object_list* head;
     
        head = List_Cons(&dummy, head);
     
    //  ....
     
        Remove(&head, &dummy);

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 35
    Points : 7
    Points
    7
    Par défaut
    Super merci !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 35
    Points : 7
    Points
    7
    Par défaut
    Le & sur un pointeur équivaut à un pointeur de pointeur? Il ne faut pas initialisé le pointeur sur head pour que ce soit véritablement un pointeur de pointeur?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Je ne sais pas trop quoi te dire ... peut-être que c'est une gymnastique de développeur et qu'il faut pratiquer

    • Un pointeur est une variable qui contient l’adresse d'une autre variable (elle pointe vers)
    • Un pointeur permet l'allocation de données sur le tas (heap) et non pas sur la pile (stack)
    • Le passage de paramètres en C est un passage par copie. Donc pour modifier un paramètre on passe un pointeur
    • Mais un pointeur en paramètre, on peut modifier sa valeur pointée mais pas le pointeur lui-même.
    • Pour modifier un pointeur soit on le retourne (ta fonction List_Cons) soit on passe un double-pointeur (l'adresse de ce pointeur) (ta procédure Remove)

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 35
    Points : 7
    Points
    7
    Par défaut
    D'accord, merci beaucoup de ta réponse!

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Lanslow Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Remove(object_list ** ppHead, object * O)
    {
        ...
    }
    Hé oui. Parce que tu n'as pas créé de type dédié à ta liste, tu te retrouves obligé de créer une fonction recevant un pointeur de pointeur.

    Je m'explique: généralement, une liste se définit par un simple noeud qui contient l'adresse du noeud suivant. Et pour tenir la liste, il suffit juste de récupérer l'adresse du premier noeud. Mais si on doit faire modifier cette adresse par une fonction, celle-ci doit alors recevoir l'adresse de cette adresse et la stocker dans un "<type> **".

    Or si on pense aussi à définir un type dédié à la liste elle-même, ce type (qui, lui, stockera ce premier noeud) devient un simple type et si on doit le faire modifier par une fonction, il suffit de lui passer un simple pointeur qu'on stockera dans un simple "<type> *"...

    Démo:
    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
    29
    30
    31
    32
    33
    34
    typedef struct s_noeud {
        int valeur;
        struct s_noeud *next;
    } t_noeud;
     
    typedef struct {
        t_noeud *tete;
    } t_liste;
     
    void init_liste(t_liste *l)
    {
        l->tete=NULL;
    }
     
    void affiche_liste(t_liste *l)
    {
        printf("Affichage de ma liste\n");
        if (l->tete == NULL) {
            printf("Liste vide\n");
            return;
        }
     
        t_noeud *pt;
        int i;
        for (pt=l->tete, i=1; *pt; pt=pt->next, i++)
            printf("Valeur noeud %d: %d\n", i, pt->valeur);
    }
     
    int main()
    {
        t_liste liste;
        init_liste(&liste);
        affiche_liste(&liste);
    }

    Outre la simplification de programmation (manipuler des "<type>*" reste plus simple que des "<type> **"), cela apporte aussi l'avantage d'être facilement évolutif. Si tu veux rajouter par exemple un compteur d'éléments, tu le rajoutes simplement dans ton t_liste. Toutes les fonctions recevant alors ce t_liste y auront alors immédiatement accès...

    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
    typedef struct {
        t_noeud *tete;
        int tot;
    } t_liste;
    
    void affiche_liste(t_liste *l)
    {
        printf("Affichage de ma liste\n");
        if (l->tete == NULL) {
            printf("Liste vide\n");
            return;
        }
    
        t_noeud *pt;
        int i;
        for (pt=l->tete, i=1; *pt; pt=pt->next, i++)
            printf("Valeur noeud %d/%d: %d\n", i, l->tot, pt->valeur);
    }
    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. Une histoire de pointeurs
    Par 0_Azerty_0 dans le forum Langage
    Réponses: 9
    Dernier message: 14/07/2012, 12h57
  2. Encore une histoire de pointeur
    Par Supersami2000 dans le forum C
    Réponses: 5
    Dernier message: 11/07/2008, 13h42
  3. Une histoire de lien...
    Par sloshy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 25/08/2005, 23h13
  4. [JAR][debutant] encore une histoire de classpath
    Par blaz dans le forum Général Java
    Réponses: 6
    Dernier message: 27/07/2005, 12h28
  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