#0 

04-03-2008 20:50:28

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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...

Code:

//Sauvegarde.h
class Sauvegarde
{
    public:

    Sauvegarde(char* Fichier, irr::scene::ICameraSceneNode* camerafps);
    void Sauvegarde::Save();

    private:

    irr::scene::ICameraSceneNode* camerafps;
    char* Fichier;


};

Code:

//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();
}

Code:

//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;
};

Code:

//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;
};

Code:

//main.cpp
int main()
{
    Graphe charge(smgr,driver);
    Acharger.Charge();
    Sauvegarde Save("save/Player.txt",charge.GetCamfps());
    Save.Save();

    while(device->run())
    {
     driver->beginScene(true, true, SColor(0,0,0,0));
     smgr->drawAll();
     gui->drawAll();
     driver->endScene();
    }
    device->drop();
    return 0;
}

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


#1 

05-03-2008 14:32:11

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

salut

Premièrement je me demande pourquoi tu utilise floor pour X et Y et pas pour Z dans

Code:

 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 :

Code:

//Sauvegarde.h
class Sauvegarde
{
    public:

    Sauvegarde(char*, irr::scene::ICameraSceneNode*);
    ~Sauvegarde();
    void Sauvegarde::Save();

    private:

    irr::scene::ICameraSceneNode* camerafps;
    char* Fichier;


};

Code:

//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


#2 

05-03-2008 15:18:20

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

Les deux lignes

Code:

    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

Code:

    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


#3 

05-03-2008 17:59:07

bebe
Membre
Date d'inscription: 17-02-2008
Messages: 18

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 wink
je commente le lignes maudites big_smile

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


#4 

05-03-2008 18:41:25

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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 lol)
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


#5 

07-03-2008 12:35:55

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

slt

Je crois savoir pourquoi ton GetCamfps ne marche pas, en effet dans la fonction Charger :

Code:

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 :

Code:

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 :

Code:

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


#6 

07-03-2008 20:39:15

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

Tout d'abord merci car maintenant quand je lance le prog sa plante plus,
mais (maleureusement y'en a toujours un lol) la ligne :

Code:

    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 :

Code:

   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


#7 

08-03-2008 12:07:13

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

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


#8 

08-03-2008 13:01:36

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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

Code:

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


#9 

09-03-2008 15:05:18

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

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


#10 

09-03-2008 17:05:51

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
30 invités en ligne
Aucun membre connecté
RSS Feed