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 :

sauvegarder une adresse et la récupérer plus tard


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Points : 1
    Points
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Points : 1
    Points
    1
    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
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Points : 1
    Points
    1
    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
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    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 ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Tu peux utiliser une collection d'objet de type tree_node ou tree_node* genre une liste ?

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/02/2015, 22h12
  2. Réponses: 15
    Dernier message: 25/09/2014, 11h56
  3. enregistrer une figure et l'utiliser plus tard
    Par jeune ingénieure dans le forum Images
    Réponses: 6
    Dernier message: 06/01/2010, 10h58
  4. [1.x] Stocker et récupérer plus tard
    Par sonja dans le forum Symfony
    Réponses: 1
    Dernier message: 19/03/2009, 10h07
  5. Comment sauvegarder une adresse
    Par @min@ dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/02/2007, 23h24

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