Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 3
    Points : 0
    Points
    0

    Par défaut sauvegarder une adresse et la récupérer plus tard

    Bonjour,
    je débute en c++, j'ai besoin d'aide concernant les pointeurs et les adresses.

    En fait j'ai une variable de type structure que je veux sauvegarder son adresse mémoire et pouvoir récupérer cette adresse pour afficher le contenu de la variable plut tard.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	tree_node* saveroot; // poiteur sur une variable de type tree_node (structure)
     
    	saveroot=(tree_node*)malloc(sizeof(tree_node)); // allocation mémoire de saveroot
     
    	saveroot= &root; // récupérer l'adresse de root qui est une variable de type tree_node
     
           //recupérer les informations du root pointé par savroot
    	std::cout<<"adresse root: "<<saveroot<<"\n\n";
    	std::cout<<"contenu: \n Energy: "<<(*saveroot).energy<<"\n";
    	std::cout<<" * indice: "<<(*saveroot).indiceTreeCoef[(*saveroot).scale]<<"\n";
    	std::cout<<" * etat: "<<(*saveroot).hiddenState<<"\n";
    	std::cout<<" * echelle: "<<(*saveroot).scale<<"\n\n";
    j'ai sauvegarder l'adresse de root dans saveroot. mon problème, c'est que root change dans la suite du code, donc l'adresse change. ce que je souhaite c'est de sauvegarder le tout premier root et le récupérer par la suite. j'ai pensé à sauvegarder l'adresse récupérée dans une variable et la récupérer après mais le problème c'est que je connais pas le type de variable que je dois utiliser ( l'adresse est de cette forme 0x7fff73049aa0), quel type dois je mettre ?

  2. #2
    Membre émérite
    Inscrit en
    décembre 2008
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 532
    Points : 802
    Points
    802

    Par défaut

    Tu es sûr d'être au point sur la distinction entre pointeur et objet pointé ?
    Plutôt que tes 3 premières lignes (qui provoquent une fuite mémoire) tu devrais avoir quelque chose comme :
    Code :
    1
    2
    3
    4
     
    // Sauvegarde de l'état de root. Pour quoi faire d'ailleurs ?
    tree_node saveroot;
    save_root = root;
    Bien sûr tree_node devrait pouvoir gérer les affection avec l'opérateur = :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Surcharge opérateur =
    struct tree_node {
      ...
      tree_node& operator=(const tree_node& other) {
        energy = other.energy;
        scale = other.hiddenState;
        ... etc ...
     
        return *this;
      }
      ...
    };
    Et les 5 dernières lignes devraient être soit une méthode tree_node::afficher(), soit une fonction afficher(const tree_node* node);

  3. #3
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 3
    Points : 0
    Points
    0

    Par défaut sauvegarde

    Bonjour,

    Tout d'abord, je vous remercie pour votre réponse.

    en fait, root est une variable qui change dans la suite du code. ce que je veux faire c'est de sauvegarder l'adresse du premier root pour pouvoir récupérer ces informations (energie, echelle, ...), c'est pour ça je fais:

    tree_node* saveroot;
    saveroot= &root;

  4. #4
    Invité de passage
    Inscrit en
    janvier 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : janvier 2013
    Messages : 3
    Points : 0
    Points
    0

    Par défaut

    mais comme root change, j'ai remarqué que saveroot change aussi au fur et a mesure.

    avez vous une solution ?

  5. #5
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 1 888
    Points : 4 991
    Points
    4 991

    Par défaut

    Bonjour,
    Citation Envoyé par nbs1522 Voir le message
    mais comme root change, j'ai remarqué que saveroot change aussi au fur et a mesure.

    avez vous une solution ?
    est-ce une blague ?
    Evidemment que saveroot change puisque saveroot est un pointeur sur root, autrement dit saveroot c'est juste une façon d'accéder à root, à elle et rien d'autre, pas une copie mais l'originale !

    Que veux-tu faire en fait ??
    A priori ce n'est pas de conserver un pointeur; tout au plus une copie mais ça a du sens ?

  6. #6
    Invité régulier
    Inscrit en
    juin 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 24
    Points : 7
    Points
    7

    Par défaut

    Tu peux utiliser une collection d'objet de type tree_node ou tree_node* genre une liste ?

  7. #7
    Membre Expert
    Avatar de white_tentacle
    Inscrit en
    novembre 2008
    Messages
    1 206
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 1 206
    Points : 1 625
    Points
    1 625

    Par défaut

    Sauf quand on fait du très bas niveau, on ne devrait JAMAIS avoir à traiter des adresses.

    Si tu veux conserver l’adresse d’une variable pour la réutiliser plus tard, ma foi, ça ressemble bien à un pointeur cette affaire. Mais ce n’est pas ton problème :

    mon problème, c'est que root change dans la suite du code, donc l'adresse change.
    Je ne pense pas. Je pense que ton problème, c’est que root change de contenu, et que donc, saveroot, qui est un pointeur sur root, n’a aucune sauvegarde du contenu, et pointe vers le nouveau contenu.

    Accessoirement, suivant où et comment root est alloué, un pointeur sur celui-ci est super louche --> dès que root sera détruit, le pointeur sera invalide.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •