Accueil > Forum > > > > Sauvegarde d'une struct complexe vers fichier possible ?
Sauvegarde d'une struct complexe vers fichier possible ?
vendredi 8 janvier 2010 à 11:50:51 |
Sauvegarde d'une struct complexe vers fichier possible ?

nomisch
|
Salut !
Dans le cadre d'un de mes projets en c++, j'ai besoin de sauvegarder la structure Particle afin de pouvoir la recharger lors du redémarrage du programme.
Cependant avec tous ces pointeurs et autres structures de données complexes ... j'ai quelques doutes sur le fait que je puisse réellement faire ce dont j'ai besoin.
Donc ma question est la suivante:
Pensez-vous qu'il est possible de sauvegarder la struct Particle dans un fichier pour la recharger ultérieurement ?
Je vous ai mis les parties relevantes (variables) des différents types/struct et classes ci-dessous. J'ai généralement omis de mettre les differentes fonctions propres a chaque classe afin de rendre tout ca plus lisible !
Si c'est possible de le faire, quelques pistes seraient les bienvenues !
En vous remerciant !
Code C/C++ : Struct Particle{
ScanMatcherMap map;
OrientedPoint pose;
double weight;
double weightSum;
double gweight;
int previousIndex;
TNode* node;
};
typedef Map<PointAccumulator, HierarchicalArray2D<PointAccumulator>> ScanMatcherMap;
template <class Cell, class Storage, const bool isClass=true> class Map{
Point m_center;
double m_worldSizeX, m_worldSizeY, m_delta;
Storage m_storage;
int m_mapSizeX, m_mapSizeY;
int m_sizeX2, m_sizeY2;
static const Cell m_unknown;
};
struct PointAccumulator{
typedef point<float> FloatPoint;
PointAccumulator(): acc(0,0), n(0), visits(0){}
PointAccumulator(int i): acc(0,0), n(0), visits(0){assert(i==-1);}
static PointAccumulator* unknown_ptr;
FloatPoint acc;
int n, visits;
};
template <class Cell> class HierarchicalArray2D: public Array2D<autoptr< Array2D<Cell> > >{
typedef std::set< point<int>, pointcomparator<int> > PointSet;
HierarchicalArray2D(int xsize, int ysize, int patchMagnitude=5);
PointSet m_activeArea;
int m_patchMagnitude;
int m_patchSize;
};
template<class Cell, const bool debug=false> class Array2D{
Cell ** m_cells;
int m_xsize, m_ysize;
};
template <class X> class autoptr{
struct reference{
X* data;
unsigned int shares;
};
reference * m_reference;
};
struct TNode{
/**Constructs a node of the trajectory tree.
@param pose: the pose of the robot in the trajectory
@param weight: the weight of the particle at that point in the trajectory
@param accWeight: the cumulative weight of the particle
@param parent: the parent node in the tree
@param childs: the number of childs
*/
TNode(const OrientedPoint& pose, double weight, TNode* parent=0, unsigned int childs=0);
OrientedPoint pose;
double weight;
double accWeight;
double gweight;
TNode* parent;
const RangeReading* reading;
unsigned int childs;
mutable unsigned int visitCounter;
mutable bool flag;
};
class RangeReading: public SensorReading, public std::vector<double>{
std::vector<Point> cartesianForm(double maxRange=1e6) const;
unsigned int activeBeams(double density=0.) const;
OrientedPoint m_pose;
};
|
|
vendredi 8 janvier 2010 à 11:58:57 |
Re : Sauvegarde d'une struct complexe vers fichier possible ?

CptPingu
|
Essaie de regarder du côté de Boost::Serialization.
Il y a un bon tuto ici:
http://khayyam.developpez.com/articles/cpp/boost/serialization/
_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
|
|
vendredi 8 janvier 2010 à 13:52:48 |
Re : Sauvegarde d'une struct complexe vers fichier possible ?

nomisch
|
Merci !
Je vais aller jeter un coup d'oeil à cette librairie.
Mais j'ai quand même quelques doutes sur le fait que j'arriver a serialiser tout ca ! Avec tous ces pointeurs et autres ... m'enfin on va essayer !
Je posterai mes résultats par ici si ca marche :-)
|
|
vendredi 8 janvier 2010 à 14:11:39 |
Re : Sauvegarde d'une struct complexe vers fichier possible ?
|
jeudi 14 janvier 2010 à 10:00:47 |
Re : Sauvegarde d'une struct complexe vers fichier possible ?

nomisch
|
Hello !
Alors je continue dans ce post ...
J'ai jeté un oeil a cette "bibliothèque" (lib...) et ça m'a l'air pas si mal.
J'ai commencé à sérialiser ma structure depuis le bas.
Je rencontre cependant quelques problèmes pour sérialiser mon tableau bi-dimensionnel (Cell** m_cells).
Je vois bien que c'est un problème de mémoire (pointeurs) mais je n'arrive pas à comprendre pourquoi ... peut-être l'un de vous pourra m'expliquer.
A noter que j'ai mis en rouge dans l'output ce qui pose problüme.
En gros, lorsque je charge mon tableau depuis le fichier, il "ecrase" les autres tableaux. Je pense qu'il le charge en "overlapant" sur leurs emplacmement mémoire ...
A noter également que je transforme mon tableau2D en 1D (flatten) avant de le sérialiser puis que j'effectue l'opération inverse juste aprüs l'avoir chargé (unflatten). Si quelqu'un connait une solution plus élégante je suis preneur ...
Voici le code et l'output:
Code C/C++ : #include <iostream>
#include <iterator>
#include <algorithm>
#include <sstream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/split_free.hpp>
using namespace std;
using namespace boost::archive;
using namespace boost::serialization;
/*
* point
*
*/
template <class T> struct point{
inline point():x(0),y(0) {}
inline point(T _x, T _y):x(_x),y(_y){}
T x, y;
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive& ar, const unsigned int version){
ar & x & y;
}
};
/*
* PointAccumulator
*
*/
struct PointAccumulator{
typedef point<float> FloatPoint;
PointAccumulator(): acc(0,0), n(0), visits(0){}
PointAccumulator(int i): acc(0,0), n(0), visits(0){assert(i==-1);}
//PointAccumulator& operator=(const PointAccumulator & pa);
static PointAccumulator* unknown_ptr;
FloatPoint acc;
int n, visits;
friend class boost::serialization::access;
template <class Archive> void serialize(Archive& ar, const unsigned int version){
ar & n & visits & acc;
}
};
/*
PointAccumulator& PointAccumulator::operator=(const PointAccumulator &pa){
acc = point<float>(pa.acc.x,pa.acc.y);
n = pa.n;
visits = pa.visits;
cout << "copied pa " << acc.x << endl;
return *this;
}
*/
/*
* Array2D
*
*/
template<class Cell, const bool debug=false> class Array2D{
public:
Array2D(int xsize=0, int ysize=0);
Array2D& operator=(const Array2D &);
Array2D(const Array2D<Cell,debug> &);
void clear();
//inline Array2D(int xsize, int ysize, const Cell * flatCells): m_cells(flatCells), m_ysize(ysize), m_xsize(xsize){}
void flatten();
void unflatten();
//~Array2D();
inline Cell& cell(int x, int y);
inline void print(){
cout << "Displaying array2D (x,y) --> (" << m_xsize << "," << m_ysize << ")" << " as (n,visits,acc.x,acc.y)" << endl;
for(int i=0;i<m_xsize;i++){
for(int j=0;j<m_ysize;j++){
cout << "(" << cell(i,j).n << "," << cell(i,j).visits << "," << cell(i,j).acc.x << "," << cell(i,j).acc.y << ") ";
}
cout<<endl;
}
/*cout << "flattened: " << endl;
for(int i=0;i<m_xsize*m_ysize;i++){
cout << "acc.x: " << m_cells1D[i].acc.x << " acc.visits: " << m_cells1D[i].visits << " ";
}*/
cout << endl;
}
Cell ** m_cells;
Cell * m_cells1D;
protected:
int m_xsize, m_ysize;
friend class boost::serialization::access;
template <class Archive> void serialize(Archive& ar, const unsigned int version){
ar & m_xsize & m_ysize;
for(int i=0; i<m_xsize*m_ysize;i++){
ar & m_cells1D[i];
}
}
};
template <class Cell, const bool debug>
Array2D<Cell,debug> & Array2D<Cell,debug>::operator=(const Array2D<Cell,debug> & g){
if (debug || m_xsize!=g.m_xsize || m_ysize!=g.m_ysize){
for (int i=0; i<m_xsize; i++)
delete [] m_cells[i];
delete [] m_cells;
m_xsize=g.m_xsize;
m_ysize=g.m_ysize;
m_cells=new Cell*[m_xsize];
for (int i=0; i<m_xsize; i++)
m_cells[i]=new Cell[m_ysize];
}
for (int x=0; x<m_xsize; x++)
for (int y=0; y<m_ysize; y++)
m_cells[x][y]=g.m_cells[x][y];
if (debug){
std::cerr << __PRETTY_FUNCTION__ << std::endl;
std::cerr << "m_xsize= " << m_xsize<< std::endl;
std::cerr << "m_ysize= " << m_ysize<< std::endl;
}
return *this;
}
template <class Cell, const bool debug>
Array2D<Cell,debug>::Array2D(int xsize, int ysize){
// assert(xsize>0);
// assert(ysize>0);
m_xsize=xsize;
m_ysize=ysize;
if (m_xsize>0 && m_ysize>0){
m_cells=new Cell*[m_xsize];
for (int i=0; i<m_xsize; i++)
m_cells[i]=new Cell[m_ysize];
}
else{
m_xsize=m_ysize=0;
m_cells=0;
}
if (debug){
std::cerr << __PRETTY_FUNCTION__ << std::endl;
std::cerr << "m_xsize= " << m_xsize<< std::endl;
std::cerr << "m_ysize= " << m_ysize<< std::endl;
}
}
template <class Cell, const bool debug>
inline Cell& Array2D<Cell,debug>::cell(int x, int y){
return m_cells[x][y];
}
template <class Cell, const bool debug>
Array2D<Cell,debug>::Array2D(const Array2D<Cell,debug> & g){
m_xsize=g.m_xsize;
m_ysize=g.m_ysize;
m_cells=new Cell*[m_xsize];
for (int x=0; x<m_xsize; x++){
m_cells[x]=new Cell[m_ysize];
for (int y=0; y<m_ysize; y++)
m_cells[x][y]=g.m_cells[x][y];
}
if (debug){
std::cerr << __PRETTY_FUNCTION__ << std::endl;
std::cerr << "m_xsize= " << m_xsize<< std::endl;
std::cerr << "m_ysize= " << m_ysize<< std::endl;
}
}
template <class Cell, const bool debug>
void Array2D<Cell,debug>::clear(){
if (debug){
std::cerr << __PRETTY_FUNCTION__ << std::endl;
std::cerr << "m_xsize= " << m_xsize<< std::endl;
std::cerr << "m_ysize= " << m_ysize<< std::endl;
}
for (int i=0; i<m_xsize; i++){
delete [] m_cells[i];
m_cells[i]=0;
}
delete [] m_cells;
m_cells=0;
delete [] m_cells1D;
m_cells1D = 0;
m_xsize =0;
m_ysize =0;
}
template <class Cell, const bool debug>
void Array2D<Cell,debug>::flatten(){
m_cells1D=new Cell[m_ysize*m_xsize];
for (int x=0; x<m_xsize; x++){
for (int y=0; y<m_ysize; y++)
m_cells1D[x*m_ysize+y]= m_cells[x][y];
}
}
template <class Cell, const bool debug>
void Array2D<Cell,debug>::unflatten(){
m_cells=new Cell*[m_xsize];
for (int x=0; x<m_xsize; x++){
m_cells[x]=new Cell[m_ysize];
for (int y=0; y<m_ysize; y++)
m_cells[x][y]= m_cells1D[x*m_ysize+y];
}
}
/*
* SaveToFile and LoadFromFile
*
*/
template <class A> void saveIntoFile(Array2D<PointAccumulator,false>& array, const char* file){
ofstream ofile(file);
A ar(ofile);
ar << array;
ofile.close();
}
template <class A> void loadFromFile(Array2D<PointAccumulator,false>& array, const char* file){
ifstream ifile(file);
A ar(ifile);
ar >> array;
ifile.close();
//return array;
}
/*
* MAIN
*
*/
int main(){
Array2D<PointAccumulator,false> myArr = Array2D<PointAccumulator,false>(2,2);
myArr.cell(0,0).acc.x = 3;
myArr.cell(0,0).n = 15;
myArr.cell(0,0).visits =16;
myArr.cell(0,1).acc.x = 3;
myArr.cell(0,1).n = 17;
myArr.cell(0,1).visits = 18;
myArr.cell(1,0).acc.x = 3;
myArr.cell(1,1).n = 20;
myArr.cell(1,1).visits = 21;
myArr.cell(1,1).acc.x = 22;
myArr.cell(1,1).acc.y = 23;
myArr.flatten();
cout << "myArray (toSave)" << endl;
myArr.print();
saveIntoFile<text_oarchive>(myArr,"out.txt");
Array2D<PointAccumulator,false> myArr4 = Array2D<PointAccumulator,false>();
myArr4 = myArr;
//Destroy myArr
myArr.clear();
cout << "myArray copy" << endl;
myArr4.print();
Array2D<PointAccumulator,false> myArr2; // = Array2D<PointAccumulator,true>();
loadFromFile<text_iarchive>(myArr2,"out.txt");
myArr2.unflatten();
cout << "myArray2 (loaded)" << endl;
myArr2.print();
//myArr2 = myArr4;
cout << "myArray (base)" << endl;
myArr.print();
cout << "myArray copy" << endl;
myArr4.print();
cout << "myArray2" << endl;
myArr2.print();
//myArr2.clear();
cout << "end" << endl;
return 0;
}
Output:
wheelchair@wheelchair-laptop:~/playerstage/boostTest$ g++ simple2.cpp -o simple -lboost_serialization
wheelchair@wheelchair-laptop:~/playerstage/boostTest$ ./simple
myArray (toSave)
Displaying array2D (x,y) --> (2,2) as (n,visits,acc.x,acc.y)
(15,16,3,0) (17,18,3,0)
(0,0,3,0) (20,21,22,23)
myArray copy
Displaying array2D (x,y) --> (2,2) as (n,visits,acc.x,acc.y)
(15,16,3,0) (17,18,3,0)
(0,0,3,0) (20,21,22,23)
myArray2 (loaded)
Displaying array2D (x,y) --> (2,2) as (n,visits,acc.x,acc.y)
(15,16,3,0) (17,18,3,0)
(0,0,3,0) (20,21,22,23)
myArray (base)
Displaying array2D (x,y) --> (0,17) as (n,visits,acc.x,acc.y)
myArray copy
Displaying array2D (x,y) --> (0,15) as (n,visits,acc.x,acc.y)
myArray2
Displaying array2D (x,y) --> (2,2) as (n,visits,acc.x,acc.y)
(15,16,3,0) (17,18,3,0)
(0,0,3,0) (20,21,22,23)
end
Segmentation fault
wheelchair@wheelchair-laptop:~/playerstage/boostTest$
|
|
dimanche 17 janvier 2010 à 14:09:59 |
Re : Sauvegarde d'une struct complexe vers fichier possible ?

CptPingu
|
Je n'arrive pas à compiler ton exemple (Je pense que c'est de ma faute, j'ai une ancienne version de Boost, la 1.35, sachant que la 1.41 est sortie).
Néanmoins, as-tu essayé de ne pas utilisé de Cell** (pas terrible en C++), mais plutôt des collections de la STL (vector de Cell par exemple) ?
Sachant qu'il est possible des les sérialiser.
Voir, tout en bas, dernier chapitre:
http://www.boost.org/doc/libs/1_41_0/libs/serialization/doc/serialization.html
_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
|
|
lundi 18 janvier 2010 à 09:07:24 |
Re : Sauvegarde d'une struct complexe vers fichier possible ?

nomisch
|
J'ai en effet penser a convertir mon tableau de Cell en un type plus "amical". Cependant étant donné que l'algorithme utilisant ces structures de donnée est bien complexe et fourni en code, je voulais essayer de preserver la strcuture de donnée tel quel afin d'éviter de reporter l'erreur plus loin ou de corriger tous les appels au tableau ...
Mais si je n'arrive pas a solutinner ce problème, je vais changer de structure pour un multi-array de la librairie boost je pense. ...
Merci encore d'avoir essayé !
|
|
Cette discussion est classée dans : int, double, pose, struct, weight
Répondre à ce message
Sujets en rapport avec ce message
Probleme de reception dans un serveur visual C++ pour windows [ par alfred ]
Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi.voici les source du client et du serveurLe Serveur
Aide [ par eikonos ]
Je travail sur une dll appellé psfg.dllj'ai ces lignes suivant de codetypedef struct CAMERAPARAM_tag{int nGain;int nOffset;int bOffsetFix;int nUpperLi
tableau a double entrée alloué dynamiquement [ par amortlintelligence ]
Voila j'aurais voulu utiliser un tableau (tableau de tableau) dans une fonction. Je pense qu'il faut donc que je le crée dynamiquement avec un code du
probleme cast [ par morgandetoi06 ]
svp aidez moi...j utilise la fonction pow qui renvoie un doubledonc je fait double b; // nombredouble j; // exposantdouble n; // reponsen=pow(b,j);don
aide sur un algorithme en dec-C++ [ par viagra ]
je souhaiterais être aidé sur un algorithme sur lequel j'éprouve des problemes. en effet lorsque je compile aussi bien au niveau de dev-c++ et MSYS, l
cosinus [ par anek971 ]
Bonjour ,ben avt de demander de l'aide j'ai chercher sur le forum mais ya pas le programme en c.Et en faite c juste pr une verification car mon progra
Segmentation Fault....en traitement d'image [ par psysta ]
Bonjour,je suis nouveau dans la programmation en C. J'ai un programme Matlab qui marche bien, et je souhaiterais l'implémenter en C. Le pgm compile bi
class matrice [ par flaky ]
Slt à tousJ'utilise une classe "matrice" (celle de nicolas aunai, téléchargée sur le site) qui fonctionne très bien. Mais j'ai du mal à manipuler l'ob
C++ de merde...enfin je veux dire... [ par brindillee ]
Salut,J'ai un petit soucis qui me cause des grands soucis...Voila j'ai choppé une fonction de décomposition (svd...) en C++ sur le net mais je n'arriv
Passage par adresse d'un tableau de structures. [ par alekine ]
Bonjour, j'ai un problème pour passer par adresse un tableau de structures. Voilà mon code:#include #define L_MAX 2struct point //la structure d'un p
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|