[Résolu] Fonctionnement des include et headers

Fonctionnement des include et headers [Résolu] - C++ - Programmation

Marsh Posté le 01-07-2011 à 00:09:52    

Salut !
 
Ça fait déjà un petit moment que je cherche sur le net pour trouver une technique qui fonctionne (et qui ne soit pas trop prise de tête) pour inclure des headers dans mon programme, sans problèmes de double inclusions, implicit declaration...
Alors, voila : pouvez vous me donner un exemple qui fonctionne bien et/ou me corriger? ^^
 
Voila comment j'ai procédé :
 
main.cpp : un #include "include.h" en haut sinon que le main

Code :
  1. #include "include.h"
  2. int main (int argc, char **argv)
  3. {
  4.     SDL_Event eEvent;
  5.     SDL_Rect vPosAff;
  6.     int bStop=0;
  7.     //Chargement des images ===========================================
  8.     printf("Loading..." );
  9.     SDL_Init( SDL_INIT_VIDEO );
  10.     oWindow = SDL_SetVideoMode(1200, 900, 16, SDL_SWSURFACE|SDL_DOUBLEBUF);
  11.     SDL_WM_SetCaption("CeaseRattelingOurMaster", NULL);
  12.     //UTILISATION DES VARIABLES GLOBALES DEFINIES DANS INCLUDE.H
  13.     //Ecran de jeu
  14.     oWelcomeScreen = SDL_LoadBMP("img/welcomescreen.bmp" );
  15.     oGameScreen = SDL_LoadBMP("img/gamescreen.bmp" );
  16.     //Crates
  17.     oWorldCrateA = SDL_LoadBMP("img/crate_a.bmp" );
  18.     //Floors
  19.     oWorldFloorRock = SDL_LoadBMP("img/floor_rock.bmp" );
  20.     printf("Complete !\n" );
  21.     //==================================================================
  22.     //UTILISATION D'UNE FONCTION DEFINIE DANS CONVERT.H
  23.     CoordScreenToWorld(vPosAff);
  24.     //Boucle pour empêcher que la fenêtre se ferme directement
  25.     while(!bStop)
  26.     {
  27.         SDL_WaitEvent(&eEvent);
  28.         switch(eEvent.type)
  29.         {
  30.             case SDL_MOUSEBUTTONUP:
  31.                 bStop=1;
  32.                 break;
  33.         }
  34.     }
  35.     SDL_Quit();
  36.     return 0;
  37. }


 
include.h : Tous les include et define, ainsi que les variables globales utilisées

Code :
  1. #ifndef INCLUDE_H_INCLUDED
  2. #define INCLUDE_H_INCLUDED
  3. //===========================================
  4. #ifdef __cplusplus
  5.     #include <cstdlib>
  6. #else
  7.     #include <stdlib.h>
  8. #endif
  9. #include <SDL/SDL.h>
  10. #include <SDL/SDL_image.h>
  11. #include "convert.h"
  12. //===========================================
  13. //Constantes
  14. #define WORLD_FLOOR_ROCK 0
  15. #define WORLD_CRATE_A 10
  16. #define COORD_OFFSET_WORLD_X 25
  17. #define COORD_OFFSET_WORLD_Y 25
  18. #define WORLD_WIDTH_PX 1150
  19. #define WORLD_WIDTH_CUBE 23
  20. #define WORLD_HEIGHT_PX 800
  21. #define WORLD_HEIGHT_CUBE 16
  22. #define WORLD_CUBE_PX 50
  23. //===========================================
  24. //Variables globales
  25. SDL_Surface *oWindow = NULL;
  26. SDL_Surface *oWelcomeScreen = NULL;
  27. SDL_Surface *oGameScreen = NULL;
  28. SDL_Surface *oWorldCrateA = NULL;
  29. SDL_Surface *oWorldFloorRock = NULL;
  30. int nWorld[WORLD_HEIGHT_CUBE][WORLD_WIDTH_CUBE] = {{0}};
  31. //===========================================
  32. #endif // INCLUDE_H_INCLUDED


 
 
convert.h : juste les déclarations des fonctions

Code :
  1. #ifndef CONVERT_H_INCLUDED
  2. #define CONVERT_H_INCLUDED
  3. //Renvoie la coord en cubes correspondant à l'endroit indiqué par vCoordScreen
  4. SDL_Rect CoordScreenToWorld(SDL_Rect vCoordScreen);
  5. //Renvoie la coord en PX par rapport à oWindow d'un cube (coin haut gauche)
  6. SDL_Rect CoordWorldToScreen(SDL_Rect CoordWorld);
  7. #endif // CONVERT_H_INCLUDED


 
 
convert.cpp : Aucun include ni define, juste les fonctions

Code :
  1. //Renvoie la coord en cubes correspondant à l'endroit indiqué par vCoordScreen
  2. SDL_Rect CoordScreenToWorld(SDL_Rect vCoordScreen)
  3. {
  4.     SDL_Rect vCoordWorld;
  5.     vCoordWorld.x = (vCoordScreen.x-COORD_OFFSET_WORLD_X)/WORLD_CUBE_PX;
  6.     vCoordWorld.y = (vCoordScreen.y-COORD_OFFSET_WORLD_Y)/WORLD_CUBE_PX;
  7.     return vCoordWorld;
  8. }
  9. //Renvoie la coord en PX par rapport à oWindow d'un cube (coin haut gauche)
  10. SDL_Rect CoordWorldToScreen(SDL_Rect CoordWorld)
  11. {
  12.     SDL_Rect vCoordScreen;
  13.     vCoordScreen.x = CoordWorld.x*WORLD_CUBE_PX+COORD_OFFSET_WORLD_X;
  14.     vCoordScreen.y = CoordWorld.y*WORLD_CUBE_PX+COORD_OFFSET_WORLD_Y;
  15.     return vCoordScreen;
  16. }


L'erreur, pour l'instant est qu'il ne reconnait pas CoordScreenToWorld(...)
 
Merci d'avance !  :hello:
 
 
                                                                                                                                           
EDIT : Résumé de ce qu'il faut faire
main.cpp : Include de stdio.h, sdl.h ...
                Include de main.h qui contient les constantes, structures...
                Include des .h que j'utilise dans le main.cpp
                Définition des variables globales
                main(...){...}
 
main.h : Liste des constantes, macro, struct... utilisées, encadrées par #ifndef ... #endif pour éviter les doubles inclusions
 
convert.cpp : Include de stdio.h, sdl.h ...
                    Include de main.h qui contient les constantes
                    Include des autres .h utilisés
                    Ne pas mettre #include "convert.h"
                    Pour réutiliser des variables globales, les "re-déclarer" en extern
 
convert.h : Déclaration des fonctions de convert.cpp (et bien sûr #ifndef ... #endif)


Message édité par crom29 le 03-07-2011 à 20:45:05

---------------
Mods: HAF922 | Shinobi XL White    GitHub     Admin de La Colère d'Aurile, serveur RP-Action Neverwinter Nights 2
Reply

Marsh Posté le 01-07-2011 à 00:09:52   

Reply

Marsh Posté le 01-07-2011 à 09:41:53    

Explique moi comment tu peux utiliser les macros : COORD_OFFSET_WORLD_X , COORD_OFFSET_WORLD_Y  et WORLD_CUBE_PX dans convert.cpp sans y inclure le fichier où ces macros sont définies ?

Reply

Marsh Posté le 01-07-2011 à 10:58:51    

dans convert.cpp, ajoute un include de include.h pour faire au plus simple.
 
Le problème vient du fait que tes headers, dans le cas général, devraient pouvoir être inclus de manière autonome. J'explique : tu devrais pouvoir inclure convert.h sans te poser de questions si tu as besoin de conversion.
 
Si jamais tu veux partager des constantes, alors c'est ton fichier qui a besoin des constantes (ici, seulement tes .cpp) qui inclus le fichier de constantes (include.h) et pas le fichier de constante qui inclus du code dont il n'est pas responsable.


---------------
last.fm
Reply

Marsh Posté le 01-07-2011 à 11:18:42    

Crom29.
La seule bonne technique qui marche est la suivante:
 
Pour le module toto.h (ou toto.hpp)
#ifndef TOTO_H
#define TOTO_H
....
#endif
 
Et avec ça, tu auras jamais de pb de double inclusion de toto.h.
Et dans tes fichiers .c (ou .cpp), la ou tu as besoin de ce qui est défini dans toto.h (et uniquement dans ces fichiers la), tu fais un
#include "toto.h"
 
To #include "include.h" avec un include qui contient les autres, c'est une mauvaise technique, à rejeter. Le #include "convert.h" n'a rien à faire dedans.
 
A+,


Message édité par gilou le 01-07-2011 à 11:24:03

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-07-2011 à 19:04:52    

Merci beaucoup de vos réponses ! :)
 
donc si j'ai bien compris, je devrais faire comme ça :
 
convert.h : Pas d'include ni de define

Code :
  1. #ifndef CONVERT_H_INCLUDED
  2.     #define CONVERT_H_INCLUDED
  3.     //Renvoie la coord en cubes correspondant à l'endroit indiqué par vCoordScreen
  4.     SDL_Rect CoordScreenToWorld(SDL_Rect vCoordScreen);
  5.     //Renvoie la coord en PX par rapport à oWindow d'un cube (coin haut gauche)
  6.     SDL_Rect CoordWorldToScreen(SDL_Rect CoordWorld);
  7.     #endif // CONVERT_H_INCLUDED


 
convert.cpp : juste include du .h contenant les déclarations des fonctions

Code :
  1. #include "convert.h"
  2.     //Renvoie la coord en cubes correspondant à l'endroit indiqué par vCoordScreen
  3.     SDL_Rect CoordScreenToWorld(SDL_Rect vCoordScreen)
  4.     {
  5.         SDL_Rect vCoordWorld;
  6.         vCoordWorld.x = (vCoordScreen.x-COORD_OFFSET_WORLD_X)/WORLD_CUBE_PX;
  7.         vCoordWorld.y = (vCoordScreen.y-COORD_OFFSET_WORLD_Y)/WORLD_CUBE_PX;
  8.         return vCoordWorld;
  9.     }
  10.     //Renvoie la coord en PX par rapport à oWindow d'un cube (coin haut gauche)
  11.     SDL_Rect CoordWorldToScreen(SDL_Rect CoordWorld)
  12.     {
  13.         SDL_Rect vCoordScreen;
  14.         vCoordScreen.x = CoordWorld.x*WORLD_CUBE_PX+COORD_OFFSET_WORLD_X;
  15.         vCoordScreen.y = CoordWorld.y*WORLD_CUBE_PX+COORD_OFFSET_WORLD_Y;
  16.         return vCoordScreen;
  17.     }


 
main.cpp : Tous les include et tous les define

Code :
  1. #ifdef __cplusplus
  2.     #include <cstdlib>
  3. #else
  4.     #include <stdlib.h>
  5. #endif
  6. #include <SDL/SDL.h>
  7. #include <SDL/SDL_image.h>
  8. #include "convert.h"
  9. //===========================================
  10. //Constantes
  11. #define WORLD_FLOOR_ROCK 0
  12. #define WORLD_CRATE_A 10
  13. #define COORD_OFFSET_WORLD_X 25
  14. #define COORD_OFFSET_WORLD_Y 25
  15. #define WORLD_WIDTH_PX 1150
  16. #define WORLD_WIDTH_CUBE 23
  17. #define WORLD_HEIGHT_PX 800
  18. #define WORLD_HEIGHT_CUBE 16
  19. #define WORLD_CUBE_PX 50
  20. //===========================================
  21. //Variables globales
  22. SDL_Surface *oWindow = NULL;
  23. SDL_Surface *oWelcomeScreen = NULL;
  24. SDL_Surface *oGameScreen = NULL;
  25. SDL_Surface *oWorldCrateA = NULL;
  26. SDL_Surface *oWorldFloorRock = NULL;
  27. int nWorld[WORLD_HEIGHT_CUBE][WORLD_WIDTH_CUBE] = {{0}};
  28. int main (int argc, char **argv)
  29. {
  30.     SDL_Event eEvent;
  31.     SDL_Rect vPosAff;
  32.     int bStop=0;
  33.     .......


 
merci de me confirmer :)
 
 
Edit : Ca ne fonctionne pas :'(
Il ne reconnais plus les fonctions, types et struct normalement incluses avec la SDL dans mes fichiers (autres que main.cpp)


Message édité par crom29 le 01-07-2011 à 19:52:16

---------------
Mods: HAF922 | Shinobi XL White    GitHub     Admin de La Colère d'Aurile, serveur RP-Action Neverwinter Nights 2
Reply

Marsh Posté le 01-07-2011 à 19:18:50    

C'est mieux.
convert.cpp il va avoir besoin d'un #include avec le fichier qui contient la définition de SDL_Rect puisqu'il l'utilise.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-07-2011 à 19:56:57    

hum... j'ai édité un peu tard !
pas grave, j'ai ma réponse ^^
 
donc je récapitule :
main.cpp : tous les include, define, struct... etc
convert.h : Juste les déclarations des fonctions définies dans convert.cpp
convert.cpp : Les include qu'utilisent les fonctions définies + include convert.h
 
A ce moment là, peut on remettre tous les include déja dans le main.cpp dans convert.cpp, sans risques de doubles include?
 
merci :)
 
 
edit : Ca ne compile toujours pas : il ne reconnais pas les macro définies dans le main.cpp et utilisées dans le convert.cpp. De même pour les variables globales


Message édité par crom29 le 01-07-2011 à 20:01:40

---------------
Mods: HAF922 | Shinobi XL White    GitHub     Admin de La Colère d'Aurile, serveur RP-Action Neverwinter Nights 2
Reply

Marsh Posté le 01-07-2011 à 20:00:19    

tu t'es complètement vautré ...
 
Il faut tout de même que tu comprennes comment se passe la compilation ... Au moins grossièrement.
 
Ton compilateur ne tient compte que des fichiers c ou cpp. Chacun de ces fichiers va être considéré comme une unité de compilation et va générer un fichier objet intermédiaire.
Une fois tous les objets générés, on passe éventuellement à l'édition de liens pour la production du fichier final (exécutable par exemple)
 
Quand tu tapes #include "unFichier.h" , en clair, tu demandes à ton préprocesseur de recopier ce fichier à cet endroit précisément dans ton unité de compilation.
Si tu as besoin qu'une constante soit accessible au sein d'une unité de compilation, alors il faut que tu demandes à ton préprocesseur d'aller te chercher l'entête qui la contient.
Si tu commences à mettre tes constantes (par exemple WORLD_CUBE_PX) directement dans une unité de compilation (dans ton dernier cas : main.cpp) alors elles ne seront jamais disponibles pour une autre unité de compilation où tu en aurais éventuellement besoin (ici : convert.cpp)
 
Il en va de même pour tes déclarations de fonctions ...


---------------
last.fm
Reply

Marsh Posté le 01-07-2011 à 20:14:02    

j'essaye de comprendre mais ça rentre assez mal ^^
 
si j'ai bien compris (cette fois ^^) :
 
Main.cpp :

Code :
  1. #ifdef __cplusplus
  2.     #include <cstdlib>
  3. #else
  4.     #include <stdlib.h>
  5. #endif
  6. #include <SDL/SDL.h>
  7. #include <SDL/SDL_image.h>
  8. #include "vars_et_cstes.h"
  9. #include "convert.h"
  10. void main(...)
  11. {
  12. ...
  13. }


 
vars_et_cstes.h :

Code :
  1. //===========================================
  2. //Constantes
  3. #define WORLD_FLOOR_ROCK 0
  4. #define WORLD_CRATE_A 10
  5. #define COORD_OFFSET_WORLD_X 25
  6. #define COORD_OFFSET_WORLD_Y 25
  7. #define WORLD_WIDTH_PX 1150
  8. #define WORLD_WIDTH_CUBE 23
  9. #define WORLD_HEIGHT_PX 800
  10. #define WORLD_HEIGHT_CUBE 16
  11. #define WORLD_CUBE_PX 50
  12. //===========================================
  13. //Variables globales
  14. SDL_Surface *oWindow = NULL;
  15. SDL_Surface *oWelcomeScreen = NULL;
  16. SDL_Surface *oGameScreen = NULL;
  17. SDL_Surface *oWorldCrateA = NULL;
  18. SDL_Surface *oWorldFloorRock = NULL;
  19. int nWorld[WORLD_HEIGHT_CUBE][WORLD_WIDTH_CUBE] = {{0}};


 
convert.h : pas de modifs
 
convert.cpp : Recopier tous les include du main?
 
EDIT : c'est fait, et j'ai des problèmes de définitions multiples de variables comme nWorld, oWindow... il me semblait que les ifndef+include+endif empêchaient ça...
 
Une question me trotte dans la tête : si j'avais mis les define et vars globales au dessus des include, ça aurait marché aussi?


Message édité par crom29 le 01-07-2011 à 20:34:58

---------------
Mods: HAF922 | Shinobi XL White    GitHub     Admin de La Colère d'Aurile, serveur RP-Action Neverwinter Nights 2
Reply

Marsh Posté le 01-07-2011 à 21:43:19    

Surtout pas:  
Pas de vars dans un .h sinon, ça va vouloir créer des vars distinctes dans chaque fichier ou il est inclus...
 
Bon.
On va démarrer par convert.cpp:

Code :
  1. //Renvoie la coord en cubes correspondant à l'endroit indiqué par vCoordScreen
  2. SDL_Rect CoordScreenToWorld(SDL_Rect vCoordScreen)
  3. {
  4.     SDL_Rect vCoordWorld;
  5.     vCoordWorld.x = (vCoordScreen.x-COORD_OFFSET_WORLD_X)/WORLD_CUBE_PX;
  6.     vCoordWorld.y = (vCoordScreen.y-COORD_OFFSET_WORLD_Y)/WORLD_CUBE_PX;
  7.     return vCoordWorld;
  8. }
  9. //Renvoie la coord en PX par rapport à oWindow d'un cube (coin haut gauche)
  10. SDL_Rect CoordWorldToScreen(SDL_Rect CoordWorld)
  11. {
  12.     SDL_Rect vCoordScreen;
  13.     vCoordScreen.x = CoordWorld.x*WORLD_CUBE_PX+COORD_OFFSET_WORLD_X;
  14.     vCoordScreen.y = CoordWorld.y*WORLD_CUBE_PX+COORD_OFFSET_WORLD_Y;
  15.     return vCoordScreen;
  16. }

Il a besoin de la définition de SDL_Rect => #include <SDL/SDL.h>
Il a besoin de la définition de diverses constantes => on va définir un fichier avec ces constanrtes.
En général, il porte le même nom que celui du programme, je vais l'appeller monprog.h ici.
D'ou
monprog.h

Code :
  1. //Constantes
  2. #ifndef _MONPROG_H_
  3. #define _MONPROG_H_
  4. #define WORLD_FLOOR_ROCK 0
  5. #define WORLD_CRATE_A 10
  6. #define COORD_OFFSET_WORLD_X 25
  7. #define COORD_OFFSET_WORLD_Y 25
  8. #define WORLD_WIDTH_PX 1150
  9. #define WORLD_WIDTH_CUBE 23
  10. #define WORLD_HEIGHT_PX 800
  11. #define WORLD_HEIGHT_CUBE 16
  12. #define WORLD_CUBE_PX 50
  13. #endif  /*_MONPROG_H_ */


 
et ça donne pour convert.cpp:

Code :
  1. #include <SDL/SDL.h>
  2. #include "monprog.h"
  3. SDL_Rect CoordScreenToWorld(SDL_Rect vCoordScreen)
  4. {
  5.     SDL_Rect vCoordWorld;
  6.     vCoordWorld.x = (vCoordScreen.x-COORD_OFFSET_WORLD_X)/WORLD_CUBE_PX;
  7.     vCoordWorld.y = (vCoordScreen.y-COORD_OFFSET_WORLD_Y)/WORLD_CUBE_PX;
  8.     return vCoordWorld;
  9. }
  10. //Renvoie la coord en PX par rapport à oWindow d'un cube (coin haut gauche)
  11. SDL_Rect CoordWorldToScreen(SDL_Rect CoordWorld)
  12. {
  13.     SDL_Rect vCoordScreen;
  14.     vCoordScreen.x = CoordWorld.x*WORLD_CUBE_PX+COORD_OFFSET_WORLD_X;
  15.     vCoordScreen.y = CoordWorld.y*WORLD_CUBE_PX+COORD_OFFSET_WORLD_Y;
  16.     return vCoordScreen;
  17. }


 
D'ou on déduit convert.h

Code :
  1. #ifndef _CONVERT_H
  2. #define _CONVERT_H
  3. SDL_Rect CoordScreenToWorld(SDL_Rect vCoordScreen);
  4. SDL_Rect CoordWorldToScreen(SDL_Rect CoordWorld);
  5.    
  6. #endif /* _CONVERT_H */


 
Reste maintenant le cas du fichier contenant main. En ce qui me concerne, je préfère l’appeler le même nom que celui du programme, je vais l'appeller monprog.c ici.
monprog.c

Code :
  1. #ifdef __cplusplus
  2.   #include <cstdlib>
  3. #else
  4.   #include <stdlib.h>
  5. #endif
  6. #include <SDL/SDL.h>
  7. #include <SDL/SDL_image.h>
  8. #include "monprog.h"
  9. #include "convert.h"
  10. SDL_Surface *oWindow = NULL;
  11. SDL_Surface *oWelcomeScreen = NULL;
  12. SDL_Surface *oGameScreen = NULL;
  13. SDL_Surface *oWorldCrateA = NULL;
  14. SDL_Surface *oWorldFloorRock = NULL;
  15. int nWorld[WORLD_HEIGHT_CUBE][WORLD_WIDTH_CUBE] = {{0}};
  16. int main (int argc, char **argv)
  17. {
  18.     SDL_Event eEvent;
  19.     SDL_Rect vPosAff;
  20.     int bStop=0;
  21.     //Chargement des images ===========================================
  22.     printf("Loading..." );
  23.     SDL_Init( SDL_INIT_VIDEO );
  24.     oWindow = SDL_SetVideoMode(1200, 900, 16, SDL_SWSURFACE|SDL_DOUBLEBUF);
  25.     SDL_WM_SetCaption("CeaseRattelingOurMaster", NULL);
  26.     //UTILISATION DES VARIABLES GLOBALES DEFINIES DANS INCLUDE.H
  27.     //Ecran de jeu
  28.     oWelcomeScreen = SDL_LoadBMP("img/welcomescreen.bmp" );
  29.     oGameScreen = SDL_LoadBMP("img/gamescreen.bmp" );
  30.     //Crates
  31.     oWorldCrateA = SDL_LoadBMP("img/crate_a.bmp" );
  32.     //Floors
  33.     oWorldFloorRock = SDL_LoadBMP("img/floor_rock.bmp" );
  34.     printf("Complete !\n" );
  35.     //==================================================================
  36.     //UTILISATION D'UNE FONCTION DEFINIE DANS CONVERT.H
  37.     CoordScreenToWorld(vPosAff);
  38.     //Boucle pour empêcher que la fenêtre se ferme directement
  39.     while(!bStop)
  40.     {
  41.         SDL_WaitEvent(&eEvent);
  42.         switch(eEvent.type)
  43.         {
  44.             case SDL_MOUSEBUTTONUP:
  45.                 bStop=1;
  46.                 break;
  47.         }
  48.     }
  49.     SDL_Quit();
  50.     return 0;
  51. }


 
Et ça devrait rouler.
 
A+,


Message édité par gilou le 01-07-2011 à 21:44:41

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-07-2011 à 21:43:19   

Reply

Marsh Posté le 01-07-2011 à 22:48:12    

Merci pour ta réponse !
 
ça compile, c'est parfait ! enfin presque ^^
 
déja, je note ce que j'ai compris qu'il fallait faire :
 
main.cpp : Include de stdio.h, sdl.h ...
                Include de main.h qui contient les constantes
                Include des .h que j'utilise dans le main.cpp
                Définition des variables globales
                main(...){...}
 
main.h : Liste des constantes & macro utilisées (et bien sûr #ifndef ... #endif)
 
convert.cpp : Include de stdio.h, sdl.h ...
                    Include de main.h qui contient les constantes
                    Ne pas mettre Include "convert.h"
                    Si je veux réutiliser des variables globales, je les "re-déclare" en extern
 
convert.h : Déclaration des fonctions de convert.cpp (et bien sûr #ifndef ... #endif)
 
 
Il me reste quand même quelques questions :
- Si je veux déclarer une structure, dois-je la mettre dans le main.h ?
- Mettons que j'ai un 3e couple de fichiers (world.cpp et world.h) et que dans world.cpp je veuilles utiliser dedans une fonction de convert.cpp, que dois-je faire?
          Pour l'instant j'ai rajouté #include "convert.h" en haut de world.cpp, mais il ne veut pas reconnaitre la fonction...
 
merci beaucoup ! :)


---------------
Mods: HAF922 | Shinobi XL White    GitHub     Admin de La Colère d'Aurile, serveur RP-Action Neverwinter Nights 2
Reply

Marsh Posté le 01-07-2011 à 23:21:42    

Citation :

- Si je veux déclarer une structure, dois-je la mettre dans le main.h ?

Si elle est utilisée ailleurs que dans main.c, oui.

Citation :

- Mettons que j'ai un 3e couple de fichiers (world.cpp et world.h) et que dans world.cpp je veuilles utiliser dedans une fonction de convert.cpp, que dois-je faire?  
          Pour l'instant j'ai rajouté #include "convert.h" en haut de world.cpp, mais il ne veut pas reconnaitre la fonction...

C'est que tu as du faire une faute de frappe dans le nom de ta fonction, car c'est comme ça qu'il faut faire.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-07-2011 à 00:19:24    

Citation :

C'est que tu as du faire une faute de frappe dans le nom de ta fonction


J'aimerais bien, parce que c'est comme ça que j'ai compris !
mais vu que si je colle la fonction dont j'ai besoin au début de world.ccp ça marche... je recommence à douter ^^
 
voici le code :  
convert.cpp :

Code :
  1. #include <SDL/SDL.h>
  2. #include "main.h"
  3. //Renvoie la coord en cubes correspondant à l'endroit indiqué par vCoordScreen
  4. SDL_Rect CoordScreenToWorld(SDL_Rect vCoordScreen)
  5. {
  6.     SDL_Rect vCoordWorld;
  7.     vCoordWorld.x = (vCoordScreen.x-COORD_OFFSET_WORLD_X)/WORLD_CUBE_PX;
  8.     vCoordWorld.y = (vCoordScreen.y-COORD_OFFSET_WORLD_Y)/WORLD_CUBE_PX;
  9.     return vCoordWorld;
  10. }
  11. //Renvoie la coord en PX par rapport à oWindow d'un cube (coin haut gauche)
  12. SDL_Rect CoordWorldToScreen(SDL_Rect CoordWorld)
  13. {
  14.     SDL_Rect vCoordScreen;
  15.     vCoordScreen.x = CoordWorld.x*WORLD_CUBE_PX+COORD_OFFSET_WORLD_X;
  16.     vCoordScreen.y = CoordWorld.y*WORLD_CUBE_PX+COORD_OFFSET_WORLD_Y;
  17.     return vCoordScreen;
  18. }


convert.h :

Code :
  1. #ifndef CONVERT_H_INCLUDED
  2. #define CONVERT_H_INCLUDED
  3. //Renvoie la coord en cubes correspondant à l'endroit indiqué par vCoordScreen
  4. SDL_Rect CoordScreenToWorld(SDL_Rect vCoordScreen);
  5. //Renvoie la coord en PX par rapport à oWindow d'un cube (coin haut gauche)
  6. SDL_Rect CoordWorldToScreen(SDL_Rect CoordWorld);
  7. #endif // CONVERT_H_INCLUDED


guifunc.cpp : Erreur : undefined reference to ' CoordWorldToScreen(SDL_Rect)'

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <SDL/SDL.h>
  6. #include <SDL/SDL_image.h>
  7. #include "main.h"
  8. #include "convert.h"
  9. extern SDL_Surface *oWindow;
  10. extern SDL_Surface *oGameScreen;
  11. extern SDL_Surface *oWorldNotSet;
  12. extern SDL_Surface *oWorldCrateA;
  13. extern SDL_Surface *oWorldFloorRock;
  14. extern int nWorld[WORLD_HEIGHT_CUBE][WORLD_WIDTH_CUBE];
  15. void RefreshGameScreen(int bFlip)
  16. {
  17.     int i, j;
  18.     SDL_Rect vPosWindow, vPosWorld;
  19.     vPosWindow.x=0; vPosWindow.y=0;
  20.     SDL_BlitSurface(oGameScreen, NULL, oWindow, &vPosWindow);
  21.     for(i=0 ; i<WORLD_HEIGHT_CUBE ; i++)
  22.     {
  23.         for(j=0 ; j<WORLD_WIDTH_CUBE ; j++)
  24.         {
  25.             vPosWorld.x = j; vPosWorld.y = i;
  26.             vPosWindow = CoordWorldToScreen(vPosWorld);//ERREUR ICI <=======
  27.             switch(nWorld[i][j])
  28.             {
  29.                 case WORLD_CUBE_FLOOR_ROCK:
  30.                     SDL_BlitSurface(oWorldFloorRock, NULL, oWindow, &vPosWindow);
  31.                     break;
  32.                 case WORLD_CUBE_CRATE_A:
  33.                     SDL_BlitSurface(oWorldCrateA, NULL, oWindow, &vPosWindow);
  34.                     break;
  35.                 default:
  36.                     SDL_BlitSurface(oWorldNotSet, NULL, oWindow, &vPosWindow);
  37.                     break;
  38.             }
  39.         }
  40.     }
  41.     if(bFlip)SDL_Flip(oWindow);
  42. }


guifunc.h :

Code :
  1. #ifndef UI_H_INCLUDED
  2. #define UI_H_INCLUDED
  3. void RefreshGameScreen(int bFlip=0);
  4. #endif // UI_H_INCLUDED


 
 
Merci encore :)
 
 
note : je ne pourrais pas répondre ce week end, alors prenez votre temps ^^


Message édité par crom29 le 02-07-2011 à 00:20:15

---------------
Mods: HAF922 | Shinobi XL White    GitHub     Admin de La Colère d'Aurile, serveur RP-Action Neverwinter Nights 2
Reply

Marsh Posté le 02-07-2011 à 03:16:24    

Tes fichiers seraient pas dans des répertoires différents?  
Parce que la, ce code la est bon, la seule chose que je vois qui ferais l'erreur indiquée, c'est que le compilo trouve pas convert.h quand il compile guifunc.cpp
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-07-2011 à 20:38:24    

bon.... le fichier était bien dans le dossier du programme mais ça ne compilait toujours pas, et du coup j'ai carrément refait un projet et là ça a marché direct ^^
 
Merci beaucoup de m'avoir aidé, je vais marquer le sujet comme résolu et mettre un petit résumé dans le 1er post ;)


---------------
Mods: HAF922 | Shinobi XL White    GitHub     Admin de La Colère d'Aurile, serveur RP-Action Neverwinter Nights 2
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed