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

Bibliothèques Discussion :

Librairie boost::serialization + vector : possible ?


Sujet :

Bibliothèques

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut Librairie boost::serialization + vector : possible ?
    Salut,

    Alors voila, dans le cadre d'une petite appli (pour m'auto former on va dire), je cherche à importer des données texte dans un objet puis serialiser le tout en fichier binaire.
    Le truc c'est que mes données sont nombreuses et doivent etre stockées dans un tableau.
    Voici grosso modo comment ca se passe :

    J'ai une structure Vertex composée de 3 floats X,Y et Z.
    une deuxieme structure Faces composées de 3 int A,B et C.
    J'ai une classe objet3d qui comporte deux Vectors : tabVertex et tabFaces.
    Quand je lis mon fichier pour recuperer mes infos, je créé plusieurs nouveaux vertex et faces que je stocke dans les tableaux dynamiquement (on ne connait pas à l'avance le nombre de chaque).

    Une fois l'objet rempli, je souhaite le serialiser.
    J'ai donc implementé le code necessaire de la librairie boost pour pouvoir le faire.
    J'ai donc donné mes deux tableaux comme etant serialisables.
    Donc, sans donner l'ordre de serialiser, la compile et l'execution passent bien. Preuve que le code ci dessous est correct :

    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
     
    class objet3d
    	{
    	friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & tabVertex;
            ar & tabFaces;
        }
     
    	private:
    		vector<Vertex> tabVertex;
    		vector<Face> tabFaces;
     
    	public:
    		void objet3d::addVertex(string X, string Y, string Z);
    		void objet3d::addFace(string A, string B, string C);
    		void objet3d::afficheVertex(void);
    		void objet3d::afficheFaces(void);
    	};
    Maintenant, lorsque je donne l'ordre de serialiser avec ce code ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ofstream streamfic("toto.tes");
    					text_oarchive outobjet(streamfic);
    					outobjet << modele;
    Sachant que modele est donc mon objet créé et rempli, ehhh bien paf le chien comme dirait l'autre...
    Une des erreurs :

    Error : Class std::Vector<Face, std::Allocator <FACE> >'has no member named 'serialize'

    Alors bon, je me suis dit que c'etait peut etre les structures qui posaient probleme. Je les ai donc transformées en objet tout en leur ajoutant la methode serialize pour que boost retrouve ses petits.

    Mais apparement ce serait Vector qui poserait probleme. Je suppose que le fait qu'il n'y ait pas la methode serialize dans sa definition de classe joue sur la compilation

    Quelqu'un saurait-il par hasard s'il y a moyen de contourner ce probleme ?

    Merci d'avance
    @++

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Re !

    Bon finalement j'ai trouvé, mais il me reste une erreur qui là, risque d'etre plutot difficile à debugger...

    Error : invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
    Je vais aller loin avec ça ^^

    Alors bon, il est certain que ça a été bien pensé leur truc car l'erreur m'ammene direct dans le code de la lib boost et juste au dessus de là ou ca buggue, c'est ecrit en commentaire ceci :

    // if your program traps here, it indicates taht your doing one of the following:
    // a) serializing an object of a type marked "track_never" through a pointer.
    // b) saving an non-const object of a type not markd "track_never)
    // Either of these conditions may be an indicator of an error usage of the
    // serialization library and should be double checked. See documentation on
    // object tracking.
    C'est fort ! D'habitude c'est plutot, ça buggue, bah debrouille toi ^^
    Bon je continue de chercher

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Bon probleme à peu pres reglé, me reste plus qu'un probleme de unknown symbol.... mais vu l'heure, vaut mieux dormir, car je vais peter un plomb si ca continue ^^
    ++

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pense à donner les solutions que tu trouves, cela pourra aider d'autres personnes

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Oui oui ne t'inquietes pas, mais j'ai toujours un probleme de STATIC ASSERTION FAILURE
    Sinon j'ai reglé un probleme en virant l'option zerolink des options de linkage de xcode (je dev sous Mac )

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    J'ai fait quelques essais à coté et voila ce que j'en ai tiré :

    Voila comment je procedais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::ofstream ofs("toto.tes");
    gps_position g(35, 59, 24.567f);
    text_oarchive oa(ofs);
    oa << g;
    Et voila l'exemple fourni par le site de boost :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     std::ofstream ofs("toto.tes");
        const gps_position g(35, 59, 24.567f);
        {
            text_oarchive oa(ofs);
            oa << g;
        }
    Donc voila mon probleme :
    Je ne comprend pas leur notation avec les accolades.
    Pour reprendre le code de l'exemple :
    Ils declarent un stream fichier ofs
    ils declarent une constante gps_position g en l'initialisant via son constructeur.

    ET Là ????? je ne sais pas, ils collent des accolades.

    Puis ils declarent oa comme text_oarchive du flux de fichier declaré plus haut
    Enfin, ils serialisent l'objet g dans oa.

    ET Là ????? encore une fois accolade.

    Le probleme c'est que moi je ne souhaite pas créer mon objet de cette maniere, avec son constructeur et de plus je ne comprend pas l'histoire des accolades.
    Pourriez vous m'aider à comprendre svp ?

    Merci d'avance
    ++

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    J'ai trouvé une parade, une fonction toute bete qui fait le taf, mais maintenant, j'aimerai comprendre ce qui fait la difference ^^

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void saveobj(const gps_position &s)
    	{
    	std::ofstream ofs("toto.tes");
        text_oarchive oa(ofs);
        oa << s;
    	}
    Et donc grace à ça je peux faire ce que je veux avec mon objet puis ensuite le serialiser.

    Seul truc que j'ai remarqué, c'est que l'on force un parametre en const, ce qui etait d'ailleurs ecrit dans le petit texte du code source que j'ai copié plus haut. Mais admettons que je ne veuille pas utiliser de fonction, comment pourrais-je traduire ce code ci dessus pour l'integrer directement dans mon main ? (juste pour comprendre exactement ce qui se passe).

Discussions similaires

  1. probleme include <boost/serialization/vector.hpp>
    Par wirenth dans le forum Boost
    Réponses: 4
    Dernier message: 24/08/2011, 14h05
  2. Boost: Serialization d'un vector d'objet
    Par antooo dans le forum Boost
    Réponses: 6
    Dernier message: 05/12/2010, 14h41
  3. tutorial pour la librairie Boost
    Par xxiemeciel dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 04/08/2005, 08h44
  4. conctruction de la librairie boost graph
    Par jiim dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 10/03/2005, 22h30
  5. boost::serialize
    Par Fry dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 05/11/2004, 18h03

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