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 :

Pointeurs vers pointeurs


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut Pointeurs vers pointeurs
    Bonjour,
    J'utilise des pointeurs vers des pointeurs et j'ai un problème !

    J'utilise cette librairie pour les arbres rouges et noirs http://en.literateprograms.org/Red-black_tree_(C).

    Je construis un arbre qui contient ce type d'éléments :
    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
    typedef struct _COLLISION
    {
        int                 type;       // type de la collision
        double              time;       // l'heure de la collision
     
        union
        {
            struct
            {
                struct _PARTICULE *p1;     // Premiere particule
                struct _PARTICULE *p2;     // Deuxieme particule
            }
            between;
            struct
            {
                struct _PARTICULE *p0;     // Particule
            }
            edge;
        }data;
    }
    COLLISION,*P_COLLISION;
    et j'ai une liste qui contient des pointeurs vers des noeuds de l'arbre et j'ai un problème lorsque je lis cette liste pour supprimer les noeuds de l'arbre.

    J'ai une fonction qui retourne un noeud (qui est un pointeur) mais je ne sais pas si il faut un pointeur vers ce noeud.

    En fait j'aimerai stocker les adresses des noeuds de l'arbre dans une liste pour pouvoir les supprimer quand je veux mais je m'embrouille avec les pointeurs !

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    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 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par azertylr Voir le message
    Bonjour,
    J'utilise des pointeurs vers des pointeurs et j'ai un problème !

    J'utilise cette librairie pour les arbres rouges et noirs http://en.literateprograms.org/Red-black_tree_(C).

    Je construis un arbre qui contient ce type d'éléments :
    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
    typedef struct _COLLISION
    {
        int                 type;       // type de la collision
        double              time;       // l'heure de la collision
     
        union
        {
            struct
            {
                struct _PARTICULE *p1;     // Premiere particule
                struct _PARTICULE *p2;     // Deuxieme particule
            }
            between;
            struct
            {
                struct _PARTICULE *p0;     // Particule
            }
            edge;
        }data;
    }
    COLLISION,*P_COLLISION;
    et j'ai une liste qui contient des pointeurs vers des noeuds de l'arbre et j'ai un problème lorsque je lis cette liste pour supprimer les noeuds de l'arbre.

    J'ai une fonction qui retourne un noeud (qui est un pointeur) mais je ne sais pas si il faut un pointeur vers ce noeud.

    En fait j'aimerai stocker les adresses des noeuds de l'arbre dans une liste pour pouvoir les supprimer quand je veux mais je m'embrouille avec les pointeurs !

    Merci
    Déjà, si tu veux moins t'embrouiller, essaye de nommer tes types "t_...". Cela t'évitera de confondre "type" et "variable".
    Ensuite, ne masque surtout pas l'étoile dans un type "*P_..." car tu vas te cacher un élément important (l'étoile) et tu sauras plus où t'en es.
    Enfin évite de travailler en majuscules

    Pour le reste, ben on peut pas comprendre les pointeurs à ta place. Si tu veux stocker un ensemble de type "COLLISION*" dans un tableau dynamique, il te faut
    1) déclarer un "COLLISION* *tab_collision=NULL;"
    2) déclarer un "size_t size_collision=0;"
    3) déclarer un "size_t nb_collision=0;"
    (moi quand je fais ça je groupe ces 3 items dans une structure)

    Puis tu alloues la mémoire pour par exemple 10 pointeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    size_collision=10;
    tab_collision=malloc(size_collision * sizeof(COLLISION*));
    if (tab_collision == NULL)
    {
            // Gérer le pb de l'allocation échouée (et certainement arrêter ici)
            return ...;
    }
    Puis chaque fois que t'as un pointeur, tu commences par regarder avec nb_collision si t'as pas atteint la taille allouée => si c'est le cas tu agrandis la taille allouée avec realloc
    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
    if (nb_collision == size_collision)
    {
        COLLISION* *new_pt;
        size_collision+=10;
        new_pt=realloc(tab_collision, size_collision * sizeof(COLLISION*));
        if (new_pt == NULL)
        {
             // Gérer le problème de la réallocation ratée en commençant par libérer la mémoire déjà allouée
            free(tab_collision);
     
            // Probablement arrêter ici la fonction
           return ...;
        }
     
        // Récupérer la nouvelle zone allouée
        tab_collision=new_pt;
    }
    Une fois que t'es certain d'avoir de la place pour stocker ton pointeur, ben tu le stockes dans un élément du tableau en n'oubliant pas d'incrémenter la variable "nb_collision" qui t'indique ton nb d'élements déjà stockés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab_collision[nb_collision]=<le_pointeur_que_je_veux_stocker>;
    nb_collision++;
    En final, tous tes pointeurs seront stockés dans un ensemble allant de
    tab_collision[0] à tab_collision[nb_collision - 1]...
    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]

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Je te remercie, je vais essayer d'utiliser un tableau plutot qu'une liste, ca sera certainement plus simple !

    Par contre le tableau ne contiendra pas un pointeur vers une collision mais un pointeur vers un noeud( rbtree_node).

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    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 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    [QUOTE=azertylr;2646747]Je te remercie, je vais essayer d'utiliser un tableau plutot qu'une liste, ca sera certainement plus simple !
    On utilise une liste lorsqu'on veut pouvoir rajouter un élément au milieu des autres. Avec un tableau faut tout décaler, avec une liste on ne change que 2 adresses.
    Si tu n'as pas besoin d'insérer au milieu mais seulement d'ajouter en fin, alors le tableau dynamique (malloc/realloc) est la solution la plus simple à mettre en oeuvre

    Citation Envoyé par azertylr Voir le message
    Par contre le tableau ne contiendra pas un pointeur vers une collision mais un pointeur vers un noeud( rbtree_node).
    Pas de pb. T'as donné un exemple de type COLLISION dans ton code, je t'ai montré comment stocker un tableau de "n" pointeurs sur le type COLLISION. Ton type n'est pas celui-là ben l'exemple est quasiment universel. En revanche, comme cet algo associe 3 variables ensemble (le tableau d'éléments, le nombre d'éléments et la taille allouée au tableau), comme je te l'ai dit mieux vaut utiliser une structure pour ça...
    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]

Discussions similaires

  1. Pointeurs et pointeurs de pointeurs
    Par wallace27 dans le forum C
    Réponses: 10
    Dernier message: 09/04/2015, 22h07
  2. pointeur vers pointeur
    Par simplyc dans le forum Débuter
    Réponses: 2
    Dernier message: 01/12/2010, 14h03
  3. Réponses: 21
    Dernier message: 06/08/2009, 09h31
  4. Réponses: 6
    Dernier message: 26/05/2007, 00h33
  5. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43

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