Probleme de compilation avec plusieurs fichier .c

adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 - 15 avril 2006 à 00:29
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 - 16 avril 2006 à 15:34
Salut

Je developpe un jeu et pour pas faire trop fouilli j ai repartie mes fonctions dans diferrents .c qui includent tous un .h ou se trouve mes variables globales et definitions de fonctions

Le probleme est qu il me dit (dev cpp) mutiple definition of "nom de la variable"
Mais quand je n inclue pas le .h ben il ne trouve pas la variable il me di qu elle n est pas definie donc je c plus trop quoi faire la

heeeeeeeelp
Voila le .h que j inclue en debut de chaque .c



#include <windows.h> // Header File For Windows
#include <stdio.h> // Header File For Standard Input/Output
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The Glaux Library
#include <stdlib.h>

BOOL keys[256]; // Array Used For The Keyboard Routine
BOOL active=TRUE; // Window Active Flag Set To TRUE By Default

//--------------FENETRE
HDC hDC=NULL; // Private GDI Device Context
HGLRC hRC=NULL; // Permanent Rendering Context
HWND hWnd=NULL; // Holds Our Window Handle
HINSTANCE hInstance; // Holds The Instance Of The Application

//--------------TEXTURES
GLuint texture[2]; // Storage For One Texture ( NEW )

//--------------DEPLACEMENTS
float movex=0,movey=0,movez=0;
float rotationx=0,rotationy=0;
float zspeed=0;

//--------------OBJETS_3D
//lists
GLuint list_ship;

typedef struct
{
float x,y,z;
}Vertex;
Vertex model[7616];
void Chargement(void);
void LoadModel(char*);



//--------------FONCTIONS
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
GLvoid glPrint(const char *fmt, ...);
GLvoid LoadList();
int LoadGLTextures();
GLvoid BuildFont(GLvoid);
int DrawGLScene();

GLuint base;

Merci de votre aide
a+

9 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
15 avril 2006 à 00:44
Ce fichier .h, tu l'inclues seulement dans ton main. ET dans tes
fichiers .c, tu mets tout la liste des variables avec extern devant le
type et sans valeur par défaut: ex: extern float zspeed;
0
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 1
15 avril 2006 à 00:55
Ok mais je persiste en disant que c pas pratique loool
Mais bon si ya pas d autre moyen je vais m y soumettre
Pour les structures je suppose que c pareil jfai : extern Vertex mavariable;

sinon un question comme sa
c koi la difference entre float et GLfloat ?
merci de tes reponses :)
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
15 avril 2006 à 02:13
Voila le contenu du gl.h :

typedef
float
GLfloat; /* single precision
float */

typedef
float
GLclampf; /* single precision float
in [0,1] */



donc aucune différence entre float et GLfloat.



Sinon t'as tout a fait raison, c'est pas pratique les variables globales. C'est pour ca qu'il faut pas les utiliser.

Tu pourrais aussi essayer en mettant tes variables dans un ".h" en les
déclarant static, et en incluant le .h partout ou t'en a besoin.
0
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 1
15 avril 2006 à 14:17
AAAAAAAAAAAAAAAARGH

J en peux plus lol

J ai reussi avec les variables en extern sa marche mais sa deconne pour les fonctions. Il me sort undefined reference to Load
Pourtant j ai declarer ma f° Load dans fonction.h que main.c inclue donc et la fonction load se trouve dans chargement.c

Apparemment il ne trouve pas la fonction mas je ne comprend pas pourquoi ?

Jvai finir pas tout entasser dans un .c tellement sa me prend le chou lol
0

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

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
15 avril 2006 à 20:23
Ne JAMAIS mettre de code ni de déclaration de variables dans .h
Pour partager des fonctions et variables entre plusieurs fichiers .c :



dans UN .c :
mettre les déclaration de variables et le code des fonctions :


int mavar = 0;


void mafct()
{
.....
}


Ensuite pour utiliser ces variable ou ces fonctions depuis d'AUTRES .c :


extern int mavar;


extern void mafct(); // extern ext facultatif pour les fcts


la solution équivalente est de mettre les déclaration avec extern dans un .h et d'inclure le .h
0
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 1
16 avril 2006 à 00:06
AAAAAAAAAAARGH
Bon les variables sa marche plus de probleme mais la j ai ma fonction Loading qui deconne tjs !!!!
Il ne l a trouve pas, undefined soit disant j ai essayer avec le extern j ai declarer ma fonction dans le .c ou j en avai besoin mais toujours rien

Bon je vous montre comment s organise mon projet je simplifie les fichiers pour laissé que la fonction qui pose probleme

chargement.c
-----------------------------
#include "fonction.h"
void Loading()
{
//-------------CHARGEMENT DES MODELS 3D
LoadModel("Data\\test.obj");
}
-----------------------------

main.c
-----------------------------
#include "fonction.h"
int InitGL(GLvoid)
{
if (!LoadGLTextures())
{
return FALSE;
}
Loading();
}
-----------------------------

fonction.h
-----------------------------
#include <windows.h> // Header File For Windows
#include <stdio.h> // Header File For Standard Input/Output
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The Glaux Library
#include <stdlib.h>

typedef struct
{
float x,y,z;
}Vertex;

//--------------FONCTIONS
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
void Loading();
GLvoid LoadList();
int LoadGLTextures();
int DrawGLScene();
void LoadModel(char*);
-----------------------------

Ce que je ne comprend pas c est que la fonction pour les textures ne pose pas de problemes et que la fonction Loading() pose un ptobleme pourtant elle sont declarées de la meme facon

Si vous avez une solution sa m aiderai bcp pcke j attend d organiser mon projet avant de le continuer
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
16 avril 2006 à 13:00
"Load dans fonction.h que main.c inclue donc et la fonction load se trouve dans chargement.c"

Mais att ! fait mettre ta fonction load dans le fonction.c puisque tu
l'as définis dans le fonction.h. Dans ton fichier .c ou tu définis la
fonction, tu inclues bien le .h ou elle est définie ?
0
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 1
16 avril 2006 à 14:45
J ai trouver le probleme !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

En faite j avait fait ce qu il fallait mais en verifiant les options de compilation j ai vu que 2 fichiers n avai pas la case "compiler en C++" de cocher j ai cocher et sa a marcher !!
Enfin .. :)
0
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 1
16 avril 2006 à 15:34
c est genial le pushmatrix !!
Merci luthor

J'espere juste que on peut en mettre autant qu on veut.
0
Rejoignez-nous