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

Langage C++ Discussion :

Problème d'adressage avec les objets.


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème d'adressage avec les objets.
    Salut.

    Je souhaite écrire des objets dans un fichier, mais si c'est un pointeur je ne veux pas l'écrire deux fois, je fais donc un test sur l'adresse avant chaque écriture pour vérifier si la variable n'a pas déjà été écrite.

    Le soucis c'est que l'adresse des objets c'est la même que l'adresse de la première variable membre des objets.

    J'ai tenter de faire hériter les classes d'une classe Serializable avec une variable membre (serialVersionID), pour que l'adresse de l'objet soit le même que la variable membre de la classe de base, mais ça ne marche pas.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct Serializable {
          Serializable() : var(0) {}
          int serrialVersionID;
    };

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Vec3f : public sf::Vector3f,  public Serializable {
         ...
    };

    L'adresse de mon objet est la même que celle de la première variable membre de l'objet malgré l'héritage.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout<<&v<<" "<<&v.x<<std::endl;

    Je cherche donc une autre solution.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 526
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 526
    Par défaut
    J'ai l'impression que vous avez une vue "candide" de la mécanique des pointeurs.
    Un même objet en mémoire peut avoir plusieurs "valeur" de pointeur, en utilisant l'héritage multiple et en ayant des pointeurs de types différents sur l'objet, leur valeur numérique est différente.
    Avec Visual Studio, tant qu'un type n'a pas de v_table, this pointe sur le premier champ de la classe "racine" de l'objet.

    Je pense que vous n'avez pas le niveau pour vous permettre de ne pas utiliser un framework de sérialisation, comme celui de boost.

  3. #3
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Une solution est de calculer un hash pour chaque objet à sérialiser. Pas de prise de tête avec les pointeurs comme ça.

    Attention quand même aux cas un peu tordus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Foo { int i; };
    struct Bar {
       int i;
       Foo f;
    };
     
    Bar b;
    serialize(b.f);
    serialize(b); // b.f aura probablement besoin d'être re-sérialisé ici

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    J'ai bien peur que tu doives convertir ces adresses en IDs, avec un dictionnaire d'adresses uniques vers ID lors de la sérialisation.
    Le dico lui-même n'a pas besoin d'être sérialisé (vu que de toute façon dans le fichier les adresses ne veulent rien dire), tu sauvegardes simplement chaque objet précédé de son ID.

    Lorsque tu désérialises, tu maintient un dico d'IDs vers adresses d'objets précédemment désérialisés.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui c'est ce que j'ai fais Medinoc, un dictionnaire. (Mais comme un objet peut avoir la même adresse que l'un de ses membres (le compilateur choisi une adresse d'une variable membre de l'objet au hasard pour la donner à l'objet), alors il ne sérialise pas la variable membre en question considérant qu'elle a déjà été sérialisée hors que c'est l'objet et pas la variable membre qui a été sérialisé, donc, ça ne fonctionne pas)

    Donc cela marche bien avec les variables simple mais pas avec les objets.

    Mais sans doute devrais je plutôt faire une variable booléenne pour les objets qui indique si l'objet a déjà été sérialisé ou pas.

    Je vais essayer ça.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Tu peux faire un dictionnaire dont la clé contienne, en plus de l'adresse de l'objet, ce qui te sert d'identificateur de type.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 776
    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 776
    Par défaut
    Citation Envoyé par Lolilolight Voir le message
    Je souhaite écrire des objets dans un fichier, mais si c'est un pointeur je ne veux pas l'écrire deux fois, je fais donc un test sur l'adresse avant chaque écriture pour vérifier si la variable n'a pas déjà été écrite.
    Cela fait 2 fois que tu viens ici pour un changement d'adresse d'une variable ou assimilé et c'est toujours

    Pourquoi tu n'utilises pas une des 2 techniques à l'ancienne, si c'est pour éviter l'écriture multiple d'un objet:
    1. Dans chaque objet, mettre un booléen is_written (ou is_not_written).
    2. Si tu as trop d'objets, avoir une liste de tes objets (une liste ... enfin vector, map, tree, deque, stack, ou autre...) et soit faire un parcours soit retirer ceux sérialisés


    Tu n'as pas une liste de tes objets dans ton moteur? c'est trop long pour générer une liste?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les objets d'une map
    Par demonia dans le forum C++
    Réponses: 2
    Dernier message: 27/11/2007, 20h37
  2. Réponses: 1
    Dernier message: 09/10/2007, 06h44
  3. probléme d'enregistrement avec les chexkbox.
    Par pmboutteau dans le forum ASP
    Réponses: 16
    Dernier message: 18/10/2005, 15h05
  4. Réponses: 6
    Dernier message: 19/05/2005, 11h06
  5. Pb avec les objets???
    Par bliml dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/04/2005, 15h39

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