Partage
  • Partager sur Facebook
  • Partager sur Twitter

Demande d'aide pour Boost::Serialization

    5 mars 2008 à 16:09:42

    Salut à tous! J'ai récemment essayé d'utiliser Boost::Serialization pour sauvegarder les données d'une carte dans un fichier. Je me suis don basé sur cet exemple.
    Du fait de nombreuses erreurs, j'ai crée un autre projet, le plus simple possible, reprenant l'organisation des classes à sérialiser de mon programme; malgrès tout, je n'ai pas réussi a compiler.

    Voici mon code:

    main.cpp:
    1. #include <fstream>
    2. #include <boost/archive/text_oarchive.hpp>
    3. #include <boost/archive/text_iarchive.hpp>
    4. #include "Carte.h"
    5. int main()
    6. {
    7.     std::ofstream ofs("carte.txt");
    8.     Carte carte1;
    9.     carte1.create(13,12,15);
    10.     {
    11.         const Carte carte2 = carte1;
    12.         boost::archive::text_oarchive oa(ofs);
    13.         oa << carte2;
    14.     }
    15.     Carte carte3;
    16.     {
    17.         std::ifstream ifs("carte.txt", std::ios::binary);
    18.         boost::archive::text_iarchive ia(ifs);
    19.         ia >> carte3;
    20.     }
    21.     return 0;
    22. }


    Carte.h:
    1. #ifndef CARTE_H_INCLUDED
    2. #define CARTE_H_INCLUDED
    3. # include <vector>
    4. #include <boost/archive/text_oarchive.hpp>
    5. #include <boost/archive/text_iarchive.hpp>
    6. #include "Couche.h"
    7. class Carte
    8. {
    9.     friend class boost::serialization::access;
    10.     public:
    11.         Carte();
    12.         ~Carte();
    13.         void create(int numero_chipset, int hauteur=20, int largeur=20);
    14.         template<class Archive>
    15.         void serialize(Archive & ar, const unsigned int version);
    16.         std::vector<bool> m_collision;
    17.         int m_hauteur;
    18.         int m_largeur;
    19.         int m_numero_chipset;
    20.         Couche m_couche[3];
    21. };
    22. #endif


    Carte.cpp:
    1. # include "Carte.h"
    2. # include <SFML/System.hpp>
    3. Carte::Carte() : m_hauteur(0), m_largeur(0), m_numero_chipset(0)
    4. {
    5.     m_collision.clear();
    6. }
    7. Carte::~Carte() {}
    8. void Carte::create(int numero_chipset, int hauteur, int largeur)
    9. {
    10.     m_hauteur = hauteur;
    11.     m_largeur = largeur;
    12.     m_numero_chipset = numero_chipset;
    13.     for (int i = 0 ; i<3 ; i++ )
    14.     {
    15.         m_couche[i].create(hauteur,largeur);
    16.     }
    17.     m_collision.resize(hauteur*largeur);
    18.     for(int i = 0; i< m_collision.size(); i++)
    19.     {
    20.         m_collision[i] = sf::Randomizer::Random(0,1);
    21.     }
    22. }
    23. template<class Archive>
    24. void Carte::serialize(Archive & ar, const unsigned int version)
    25. {
    26.     ar & m_hauteur;
    27.     ar & m_largeur;
    28.     m_collision.resize(m_hauteur*m_largeur);
    29.     for(int i = 0; i < m_collision.size(); i++) ar & m_collision[i];
    30. }


    Couche.h:
    1. #ifndef COUCHE_H_INCLUDED
    2. #define COUCHE_H_INCLUDED
    3. # include <vector>
    4. #include <boost/archive/text_oarchive.hpp>
    5. #include <boost/archive/text_iarchive.hpp>
    6. class Couche
    7. {
    8.     friend class boost::serialization::access;
    9.     public:
    10.     Couche();
    11.     ~Couche();
    12.     void create(int hauteur, int largeur);
    13.     template<class Archive>
    14.     void serialize(Archive & ar, const unsigned int version);
    15.     std::vector<short> m_data;
    16.     int m_hauteur;
    17.     int m_largeur;
    18. };
    19. #endif


    Couche.cpp:
    1. #include "Couche.h"
    2. #include <SFML/System.hpp>
    3. Couche::Couche() : m_hauteur(0), m_largeur(0)
    4. {
    5.     m_data.clear();
    6. }
    7. Couche::~Couche()
    8. {
    9. }
    10. void Couche::create(int hauteur, int largeur)
    11. {
    12.     m_hauteur = hauteur;
    13.     m_largeur = largeur;
    14.     int nbr_tiles = hauteur*largeur;
    15.     m_data.resize(nbr_tiles);
    16.     for(int i =0; i< nbr_tiles; i++)
    17.     {
    18.         m_data[i] = sf::Randomizer::Random(50, 100);
    19.     }
    20. }
    21. template<class Archive>
    22. void Couche::serialize(Archive & ar, const unsigned int version)
    23. {
    24.     ar & m_hauteur;
    25.     ar & m_largeur;
    26.     m_data.resize(m_hauteur*m_largeur);
    27.     for(int i = 0; i <(m_hauteur*m_largeur); i++) ar & m_data[i];
    28. }


    Merci a ceux qui ont tout lu. J'ai linké avec -lboost_serialization et -lsfml-system.
    J'ai volontairement tout mis en public.

    Voici le log:
    1. /usr/include/boost/serialization/access.hpp:109: undefined reference to `void Carte::serialize<boost::archive::text_iarchive>(boost::archive::text_iarchive&, unsigned int)'
    2. /usr/include/boost/serialization/access.hpp:109: undefined reference to `void Carte::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive&, unsigned int)'
    3. :: === Build finished: 2 errors, 0 warnings ===


    A+,

    Loumnam.
    • Partager sur Facebook
    • Partager sur Twitter

    Demande d'aide pour Boost::Serialization

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown