Bonjours ,
Voilà je poste car je lutte depuis quelque temps avec la POO mais j'arrive pas à m'en sortir
j'essaie de faire un système de sauvegarde (rudimentaire :p ) mais sa plante a l'éxécution
En gros m'ont code est composé de 3 parties : le main, la class sauvegarde et la class où je charge mes cam/modéle/etc...
//Sauvegarde.h class Sauvegarde { public: Sauvegarde(char* Fichier, irr::scene::ICameraSceneNode* camerafps); void Sauvegarde::Save(); private: irr::scene::ICameraSceneNode* camerafps; char* Fichier; };
//sauvegarde.cpp Sauvegarde::Sauvegarde(char* Fichier, irr::scene::ICameraSceneNode* camerafps) { this->Fichier = Fichier; this->camerafps = camerafps; } void Sauvegarde::Save() { core::vector3df posCam; posCam = camerafps->getPosition(); ofstream sauvegarde(Fichier, ios::out | ios::trunc); if(sauvegarde) { sauvegarde << floor(posCam.X) << "\n" << ceil(posCam.Y) << "\n" << floor(posCam.Z) << endl; } sauvegarde.close(); }
//graphe.h class Graphe { public: Graphe(irr::scene::ISceneManager* smgr, irr::video::IVideoDriver* driver); void Graphe::Charger(); irr::scene::ICameraSceneNode* GetCamfps() const; private: irr::scene::ISceneManager* smgr; irr::scene::ICameraSceneNode* camerafps; irr::video::IVideoDriver* driver; };
//graphe.cpp Graphe::Graphe(irr::scene::ISceneManager* smgr, irr::video::IVideoDriver* driver,irr::gui::IGUIEnvironment* gui) { this->smgr = smgr; this->driver = driver; this->gui = gui; } void Graphe::Charger() { irr::scene::ICameraSceneNode* camerafps = smgr->addCameraSceneNodeFPS(0,100.0f,500.0f,-1,keyMap,6,false,0.0f); }; irr::scene::ICameraSceneNode* Graphe::GetCamfps() const { return camerafps; };
le bug vient de
Sauvegarde Save("save/Player.txt",charge.GetCamfps());
car quand je crée une cam dans mon main sa marche
merci d'avance pour vos réponses
Dernière modification par bestben (04-03-2008 22:10:32)
Hors ligne
salut
Premièrement je me demande pourquoi tu utilise floor pour X et Y et pas pour Z dans
sauvegarde << floor(posCam.X) << "\n" << ceil(posCam.Y) << "\n" << floor(posCam.Z) << endl;
et pourquoi ne pas mettre endl partout a la place de "\n" enfin le probleme ne vient surement pas de la mais je trouve sa stressant.
Enfin sinon j'ai vu un problème dans ton code dans le constructeur de Sauvegarde qui vient d'une mauvais maîtrise des pointeurs. En effet tu passe un argument des pointeurs au constructeur puis ensuite tu sauvegarde ces pointeurs dans les variables de la classe sauvegarde mais pas les données. Bon je vais pas faire un cours sur les pointeurs mais en gros faut mettre les donnée dans la classe sauvegarde car tu n'est pas sur que les données soit pas détruite dans main(et actuellement les pointeurs pointe vers les données crée dans main).
Plusieurs solutions s'offre a toi : ne plus utilisé les pointeurs ou utiliser le tas : new.
En gros moi je ferais sa :
//Sauvegarde.h class Sauvegarde { public: Sauvegarde(char*, irr::scene::ICameraSceneNode*); ~Sauvegarde(); void Sauvegarde::Save(); private: irr::scene::ICameraSceneNode* camerafps; char* Fichier; };
//sauvegarde.cpp Sauvegarde::Sauvegarde(char* fichier, irr::scene::ICameraSceneNode* Camerafps) { Fichier = new (*fichier); camerafps = new (*Camerafps); } Sauvegarde::~Sauvegarde() { delete Fichier; delete camerafps; } void Sauvegarde::Save() { core::vector3df posCam; posCam = camerafps->getPosition(); ofstream sauvegarde(Fichier, ios::out | ios::trunc); if(sauvegarde) { sauvegarde << floor(posCam.X) << "\n" << ceil(posCam.Y) << "\n" << floor(posCam.Z) << endl; } sauvegarde.close(); }
Voila je ne sais pas si cela solutionnera ton problème mais je le pense.
si tu a une erreur de compilation pour les lignes avec les new enlève les * devant fichier et Camerafps car je ne sais plus si on doit mettre un pointeur ou la donné en argument.
a+
dark calculator
Dernière modification par dark calculator (05-03-2008 14:36:58)
Hors ligne
Les deux lignes
Fichier = new (*fichier); camerafps = new (*Camerafps);
ne marche pas, j'ai essayé avec et sans les *, en retirant les parenthéses etc... mais sa ne marche pas
j'ai remplacer les deux lignes par
Fichier = new char; camerafps = new irr::scene::ICameraSceneNode;
mais la seconde ligne ne compile pas
du coup je vois pas trop comment faire ...
merci quand même
PS : les ceil et floor c'est pour le sol et les mur comme sa la coordonné est arrondi au nombre au dessus si je me trompe pas
car si j'avais mis la coordonné inférieur je serai parti dans le sol
Hors ligne
Bonjours,
bon, ya plusieurs choses qui m'ont interpelés, je te les met en vrac, à toi de corriger ton code, je n'ai pas non plus le temps de chercher l'erreur
je commente le lignes maudites
Dans graph.h
On ne met pas le namespace de la classe dans la déclaration de l'un de ses attributs, donc vire le "Graphe::"
void Graphe::Charger();
Dans le main, comment peut -tu écrire ceci :
Graphe charge(smgr,driver);
Où as-tu déclaré smgr et driver ? oO
Si ils sont instanciés comme variables globales ou encore pire dans une autre classe ils faut corriger ça et les définirs dans le main, avant l'appel à cette fonction.
bon, déjà part du code de Dark Calculator.
ya ça qui est absurde :
//graphe.cpp
this->smgr = smgr;
this->driver = driver;
this->gui = gui;
vire moi le "this->" car tu est déjàs dans l'objet "this", en plus là du coup tu pointe sur des pointeurs, donc tu attribut l'adresse mémoire d'un pinteur à une valeur.
ex : smgr (déjà je sais pas comment ça compile si t'a les 2 mêmes noms de variables...) est un pointeur vers une classe scène manager insanciée par irrlicht, si tu fait "this->smgr" (donc le pointeur déclaré dans le .h) et bien tu pointe vers sa valeur, donc tu lui associe comme objet la valeur du pointeur de la classe déclarée par irrlicht .... ><
Ya encore d'autres fautes, excuse moi mais je n'ai plus le temps de te répondre, je doit y aller, à une prochaine ^^
Hors ligne
salut,
bon d'abord pour le graphe:: je viens de l'effacer,
le smgr et driver ont été déclaré mais je n'est pas mis tous mon Main.cpp,
pour le this-> je viens de l'effacer (sa je savais franchement pas quoi en faire )
merci pour les infos (maintenant je saurait :p )
( mais sa marche toujours pas )
[EDIT] Après avoir essayé plusieurs truc j'ai réussi à découvrir que :
Acharger.GetCamfps()
renvoi 0, sa m'avance pas plus mais c'est bon à savoir (au moins sa réduit les possibilité)
Dernière modification par bestben (05-03-2008 22:23:04)
Hors ligne
slt
Je crois savoir pourquoi ton GetCamfps ne marche pas, en effet dans la fonction Charger :
void Graphe::Charger() { irr::scene::ICameraSceneNode* camerafps = smgr->addCameraSceneNodeFPS(0,100.0f,500.0f,-1,keyMap,6,false,0.0f); };
Tu crée un nouveau pointeur : camerafps qui est automatiquement détruit a la fin de la fonction, puisqu'il est crée dans la fonction. Il faut enlever le irr::scene::ICameraSceneNode* ce qui donne :
void Graphe::Charger() { camerafps = smgr->addCameraSceneNodeFPS(0,100.0f,500.0f,-1,keyMap,6,false,0.0f); };
Excuse moi pour les affectations de Fichier et camerafps, ce que je t'ai donné est absurde voila comment faire :
Sauvegarde::Sauvegarde(char* fichier, irr::scene::ICameraSceneNode* Camerafps) { Fichier = new char [strlen(fichier)+1] (*fichier); camerafps = Camerafps; }
Tu avais raisons de passer les pointeurs pour Camerafps en revanche je pense qu'il vaut mieux ne pas garder quelque chose qui pointe sur une chaîne crée par "" car je ne sais pas quand elles sont détruites.
voila j'espère ne pas avoir fait d'erreur le +1 après strlen n'est peut être pas indispensable mais je l'est mis pour plus de sécurité et tu aura si ce n'est pas fait a rajouter #include <string.h> au début de sauvegarde.cpp.
En espérant avoir aider
Dark calculator
Hors ligne
Tout d'abord merci car maintenant quand je lance le prog sa plante plus,
mais (maleureusement y'en a toujours un ) la ligne :
Fichier = new char [strlen(fichier)+1] (*fichier);
Ne veut pas compiler tel quelle
Il faut soit que je retire [strlen(fichier)+1], soit (*fichier)
Mais le programme me créé un fichier nommé N,R,YY... par exemple
Si j'écris :
Fichier = fichier;
le fichier est créé comme il faut mais (encore!??!) mes coordonnés ressemble a ça :
0
5.97209e+26
0
donc si quelqu'un a une idée ...
Merci quand même pour vos réponses
Dernière modification par bestben (07-03-2008 20:53:43)
Hors ligne
Salut
Désolés pour mes réponses qui doivent être erroné mais j'ai trop la flemme de faire des tests donc si le fichier est bien crée c'est que la chaîne de caractère est détruite au bon moment.
Sinon pour tes coordonnées je ne sais pas quoi en penser il faudrait mettre un static text dans ton environnement pour les voir en temps réels et les comparés avec celle qui sont sauvegarder. Après tu peut essayer sans les fonctions floor et ceil histoire de voir ce que sa donne.
Tu peut aussi nous dire ce que tu a mis d'autre dans ton code si tu a juste mis la cam ou aussi d'autre modèle ainsi que peut être un gestionnaire de collision.
voila
dark calculator
Dernière modification par dark calculator (08-03-2008 12:11:50)
Hors ligne
Salut,
je viens d'essayer d'afficher les coordonné de ma cam au fur et à mesure des étapes :
dans la fonction Graphe::Charger() les coordonnés sont 0 0 0 (donc a première vue normal) sauf que quand je les est changé elle resté à 0 0 0 donc déjà un problème ensuite j'ai continué (même si sa servais à rien) j'ai créé une fonction Graphe::PrintCoo()
les coordonné ressemble à 9.71088e-3500,
le plus bizarre c'est que si je met juste
cout << posCam.X << endl; ou std::cout << posCam.X << " " << posCam.Y << " " << posCam.Z << std::endl;
j'ai exactement le même résultat
Sinon dans ma fonction Graphe::Charger() j'ai mis tous mes modèles, etc ...
et je n'est pas encore mis le gestionnaire de collision
Sans floor et Ceil la différence est que mes coordonné ne sont plus 0 1 0
Et... je crois que c'est tout (sa fait déjà beaucoup )
PS: pas trop grave si les réponses sont erroné sa me donne au moins un bout de réponse
Hors ligne
Tu pourais essayé d'utilisé printf a la place de cout par ce que je ne lui fait que moyennement confiance, par contre fait attention a bien maitre %f si c'est un float ou ce qu'il faut.
voila sinon je vois pas trop par contre il faut savoir que 9.71088e-3500 = 0 donc apres faut voir quel coordonée il devrait donné
a+
dark calculator
Hors ligne
Je viens d'essayer avec printf et sa me donne 0 mais sa devrait me donner 500 donc pas de différence
je vais continuer à chercher j'aurais peut être un peut de chance
[edit] J'utilise les version svn et je sais pas trop pourquoi mais en refaisant la mise a jour des source et en recompilant mes coordonné remarchent
J'ai eu l'idée en déclarant normalement une caméra dans le main et en faisant un getPosition qui ne marchait pas
donc merci de vos réponses
Dernière modification par bestben (09-03-2008 18:02:33)
Hors ligne