Pb de debutant.

Résolu
Asaturne Messages postés 6 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 22 mars 2005 - 7 mars 2005 à 20:24
Asaturne Messages postés 6 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 22 mars 2005 - 8 mars 2005 à 17:28
Voila je suis etudiant en info et je suis actuellement en stage dans une univeriste pour obtenir mon diplome.

Etant donnee la formation que j ai suivie (Merci IUT montpellier), on ne m a pas appris le c++ et je l apprend dans le meme temps que je devellope une application. Cela fais maintenant deux jours que je bloque sur ce probleme s'il y avait une ame charitable pour m'aider je lui serais eternellement reconnaissant.

L'application que je dois develloper consiste a poser des waypoint dans un niveau en 3d le tout a l aide d'un "dropper". Le moteur utilise et un moteur propre a l'universite mais je pense qu il n est pas necessaire de le detailler pour resoudre mon probleme.

Tout d'abord voici la classe Dropper.

#include <TL-Engine.h> // TL-Engine include file and namespace
using namespace tle;

class Dropper
{

IMesh *myMesh;
IModel *myPlayer;


bool move;
float speedMove;


public:


void MoveDropper(I3DEngine *engine);
float GetZ();
float GetY();
float GetX();
Dropper();
virtual ~Dropper();
Dropper(I3DEngine *engine,IModel *level);
Waypoint* DropWaypoint(I3DEngine *engine,Waypoint *precedent);
};

#include "Dropper.h"
#include "Waypoint2.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


Dropper::Dropper(){}


Dropper::~Dropper(){}


float Dropper::GetX()
{return myPlayer->GetX();}


float Dropper::GetY()
{return myPlayer->GetY(); }


float Dropper::GetZ()
{return myPlayer->GetZ();}


Dropper::Dropper(I3DEngine *engine, IModel *level)
{
myMesh = engine->LoadMesh("Marine.md2");
myPlayer = myMesh ->CreateModel(0,0,0);
myPlayer->SetSkin ("Marine2.jpg");

myPlayer->EnableCollisions(level);


move = false;
speedMove =2.0f;
}


void Dropper::MoveDropper(I3DEngine *engine)
{
if (engine->KeyHeld(Key_W)) {move = true; myPlayer->MoveLocalZ(speedMove);}
if (engine->KeyHeld(Key_S)) {move = true; myPlayer->MoveLocalZ(-speedMove);}
if (engine->KeyHeld(Key_A)) {move = true; myPlayer->MoveLocalX(-speedMove);}
if (engine->KeyHeld(Key_D)) {move = true; myPlayer->MoveLocalX(speedMove);}


if (move) { myPlayer->DoQuakeAnimation(QAnim_Run);}
else { myPlayer->DoQuakeAnimation(QAnim_Stand);}


move=false;
}


Waypoint* Dropper::DropWaypoint(I3DEngine *engine, Waypoint *precedent)
{return precedent->Insert(engine,this);}

Et voici la classe Waypoint (contenu dans les fichier Waypoint2.*)

#include <TL-Engine.h> // TL-Engine include file and namespace
using namespace tle;
#include <strstream>
using namespace std;
#include "Dropper.h"
#include "Waypoint2.h"


class Waypoint
{

Waypoint *Next;
float posY;
float posX;
float posZ;

public:

Waypoint* Insert(I3DEngine *engine, Dropper *player);
float GetZ();
float GetY();
float GetX();


Waypoint();
Waypoint(I3DEngine *engine, Dropper *player, Waypoint *precedent);

static void Display(I3DEngine *engine,Waypoint *wpt);
Waypoint* GetNext();


};

#include "Waypoint2.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////







Waypoint::Waypoint()
{


}


Waypoint* Waypoint::GetNext()
{
return Next;
}


void Waypoint::Display(I3DEngine *engine, Waypoint *wpt)
{
Waypoint *bck=wpt;


while (bck)
{
char text[100];
ostrstream textOut( text, 100 );
textOut << "X:" << bck->GetX(); // works like cout, but the output will
textOut << "Y:" << bck->GetY(); // fill a string instead of the console.
textOut << "Z:" << bck->GetZ(); // Use the string stream exactly like
textOut << '\0'; // cout, but remember the final '\0'
engine->SetWindowCaption( text );


bck=bck->GetNext();

}
}


Waypoint::Waypoint(I3DEngine *engine, Dropper *player, Waypoint *precedent)
{
posX=player->GetX();
posY=player->GetY();
posZ=player->GetZ();


if (precedent)
{
Next = precedent->Next;
precedent->Next=this;
}
else Next =0;


IMesh* waypointMesh = engine->LoadMesh("Cube.x");
IModel* waypointModel = waypointMesh->CreateModel(posX,posY,posZ);
waypointModel->SetSkin ("Tiles2.jpg");
}


float Waypoint::GetX(){ return posX;}


float Waypoint::GetY(){return posY;}


float Waypoint::GetZ(){return posZ;}


Waypoint* Waypoint::Insert(I3DEngine *engine, Dropper *player)
{
Waypoint* wpt = new Waypoint(engine,player,this);


char text[100];
ostrstream textOut( text, 100 );

textOut << "X:" << wpt->GetX(); // works like cout, but the output will
textOut << "Y:" << wpt->GetY(); // fill a string instead of the console.
textOut << "Z:" << wpt->GetZ(); // Use the string stream exactly like
textOut << '\0';

engine->SetWindowCaption( text );


return wpt;
}

Lors de la compilation de Dropper.cpp voici la liste des erreurs que visual c++ 6 me donne :

f:\project\essai2\dropper.h(42) : error C2143: syntax error : missing ';' before '*'
f:\project\essai2\dropper.h(42) : error C2501: 'Waypoint' : missing storage-class or type specifiers
f:\project\essai2\dropper.h(42) : error C2061: syntax error : identifier 'Waypoint'
f:\project\essai2\dropper.h(42) : error C2501: 'DropWaypoint' : missing storage-class or type specifiers
f:\project\essai2\dropper.cpp(64) : error C2511: 'DropWaypoint' : overloaded member function 'class Waypoint *(class tle::I3DEngine *,class Waypoint *)' not found in 'Dropper'

Est ce que quelqu'un peut m expliquer et me dire ou est situe mon probleme et comment le resoudre ?

P.S : desole pour l absence d accent ... foutus claviers britanniques, et de la longueur du post

7 réponses

estelledany Messages postés 13 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 8 mars 2005
8 mars 2005 à 12:03
Euh, d'après ton code, tu fait un #include "Waypoint2.h" dans le fichier Waypoint2.h, il faut l'enlever sinon ca fait une définition circulaire et le compilo s'y pert !

Ensuite, c'est une bonne idée de commencer tout tes fichier .h par :
#pragma once

ou si tu utilise pas visual studio, encadre la totalité de tes fichiers .h par :
#ifndef LE_NOM_DU_FICHIER_H_INCLUDED
#define LE_NOM_DU_FICHIER_H_INCLUDED

// ici le source de ton fichier .h

#endif

Sinon, j'ai aussi remarqué que dans Waypoint2.h, tu fait #include "Dropper.h" et dans Dropper.h, tu fais (ou plutot devrait faire) #inlcude "Waypoint2.h".....
Même principe, ca fait une définition circulaire !!!!

Donc, à mon sens, voilà le code tel qu'il devrait être réellement :)

Fichier "dropper.h"
#ifndef DROPPER_H_INCLUDED
#define DROPPER_H_INCLUDED

class Dropper; // Déclaration anticipée pour lever le cycle...

#include "Waypoint2.h" // Tu utilise des objets de type Waypoint
#include <TL-Engine.h> // TL-Engine include file and namespace
using namespace tle;

class Dropper
{

IMesh *myMesh;
IModel *myPlayer;
bool move;
float speedMove;


public:


void MoveDropper(I3DEngine *engine);
float GetZ();
float GetY();
float GetX();
Dropper();
virtual ~Dropper();
Dropper(I3DEngine *engine,IModel *level);
Waypoint* DropWaypoint(I3DEngine *engine,Waypoint *precedent);
};

#endif

Fichier Dropper.cpp

#include "Dropper.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


Dropper::Dropper(){}


Dropper::~Dropper(){}


float Dropper::GetX()
{return myPlayer->GetX();}


float Dropper::GetY()
{return myPlayer->GetY(); }


float Dropper::GetZ()
{return myPlayer->GetZ();}


Dropper::Dropper(I3DEngine *engine, IModel *level)
{
myMesh = engine->LoadMesh("Marine.md2");
myPlayer = myMesh ->CreateModel(0,0,0);
myPlayer->SetSkin ("Marine2.jpg");
myPlayer->EnableCollisions(level);


move = false;
speedMove =2.0f;
}


void Dropper::MoveDropper(I3DEngine *engine)
{
if (engine->KeyHeld(Key_W)) {move = true; myPlayer->MoveLocalZ(speedMove);}
if (engine->KeyHeld(Key_S)) {move = true; myPlayer->MoveLocalZ(-speedMove);}
if (engine->KeyHeld(Key_A)) {move = true; myPlayer->MoveLocalX(-speedMove);}
if (engine->KeyHeld(Key_D)) {move = true; myPlayer->MoveLocalX(speedMove);}


if (move) { myPlayer->DoQuakeAnimation(QAnim_Run);}
else { myPlayer->DoQuakeAnimation(QAnim_Stand);}


move=false;
}


Waypoint* Dropper::DropWaypoint(I3DEngine *engine, Waypoint *precedent)
{return precedent->Insert(engine,this);}

Ensuite : Fichier Waypoint2.h

#ifndef WAYPOINT_H_INCLUDED
#define WAYPOINT_H_INCLUDED

class Wayoint; // Déclaration anticipée...

#include "Dropper.h"
#include <TL-Engine.h> // TL-Engine include file and namespace
using namespace tle;
#include <strstream>
using namespace std;


class Waypoint
{
Waypoint *Next;
float posY;
float posX;
float posZ;

public:

Waypoint* Insert(I3DEngine *engine, Dropper *player);
float GetZ();
float GetY();
float GetX();

Waypoint();
Waypoint(I3DEngine *engine, Dropper *player, Waypoint *precedent);

static void Display(I3DEngine *engine,Waypoint *wpt);
Waypoint* GetNext();

};

#endif

Enfin, le fichier Waypoint2.cpp

Il commence par :
#include "Waypoint2.h"
et ensuite, je pense que ton code est bon, donc tu peux le garder tel quel !

Pour explication, tu utilise Dropper dans Waypoint, et inversement.... Le compilo s'y retrouve plus car t'as pas mis de déclaration anticipée.
Conséquence, il considère que les classes existent pas (ou sont mal déclarées...)

Voilà, essaye ca doit amrcher comme ca
3
estelledany Messages postés 13 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 8 mars 2005
7 mars 2005 à 22:54
Bonjour,
Je ne sais pas si ça vient de là mais peut-être faut-il mettre #include "Waypoint.h"dans la classe Dropper car tu utilise un pointeur sur un objet de type waypoint.
0
Asaturne Messages postés 6 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 22 mars 2005
8 mars 2005 à 11:31
J 'avais mis le "#include "Waypoint2.h" dans l'implementation et non pas dans le header, j'ai effectuer la modification et maintenant voici les erreurs que j'obtiens ...

f:\project\essai2\waypoint2.h(31) : error C2061: syntax error : identifier 'Dropper'
f:\project\essai2\waypoint2.h(40) : error C2629: unexpected 'class Waypoint ('
f:\project\essai2\waypoint2.h(40) : error C2238: unexpected token(s) preceding ';'
f:\project\essai2\dropper.cpp(65) : error C2660: 'Insert' : function does not take 2 parameters

Une idee ?
0
estelledany Messages postés 13 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 8 mars 2005
8 mars 2005 à 12:05
humpf! lol
désolé, mon doigt a du déraper sur la taille du texte !!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Asaturne Messages postés 6 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 22 mars 2005
8 mars 2005 à 12:17
Youpiii ca marche .... grand merci !!!

Petite question : que veut dire #pragma once ?
0
estelledany Messages postés 13 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 8 mars 2005
8 mars 2005 à 13:18
ça veut dire : Inclure une seule fois le fichier, même si il apparait à plusieurs endroits en même temps.
0
Asaturne Messages postés 6 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 22 mars 2005
8 mars 2005 à 17:28
Merci pour l'indication ... et encore merci pour l aide ca m a enleve une sacree epine du pied.
0
Rejoignez-nous