IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème d'inclusions imbriquées


Sujet :

C

  1. #1
    b4u
    b4u est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut Problème d'inclusions imbriquées
    Bonsoir,

    j'ai deux headers (pour simplifier...) définis comme ça (je n'ai mis que les parties intéressantes):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #ifndef	_LAYOUT_H
    #define	_LAYOUT_H
     
    #include "point.h"
    #include "plane.h"
    #include "scene.h"
     
     
    typedef struct
    {
    	Plane		plane;
    	Plane		scrollable;
    	Point		refresh;
    	void		*memory;
    } Layout;
     
     
    void		Layout_DrawScene(Layout *this, Scene *scene, Point *position);
     
     
    #endif	/* _LAYOUT_H */

    et le deuxième, qui inclut le premier:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #ifndef	_SCENE_H
    #define	_SCENE_H
     
    #include "layout.h"
    #include "character.h"
    #include "level.h"
     
     
    typedef struct
    {
    	Layout		screen;
    	Level		level;
    	Character	player;
    } Scene;
     
     
    #endif	/* _SCENE_H */

    Mais ça ne compile pas, car les deux headers s'incluent l'un l'autre (j'ai déja vu la réponse quelquepart mais je n'arrive pas à remettre la main dessus)

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Sans l'avoir testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    /* On n'utilise pas un '_' en premier caractère donc je change... */
    #ifndef	H_LAYOUT
    #define	H_LAYOUT
     
    struct sLayout;
     
    #include "point.h"
    #include "plane.h"
    #include "scene.h"
     
     
    typedef struct sLayout
    {
    	Plane		plane;
    	Plane		scrollable;
    	Point		refresh;
    	void		*memory;
    } Layout;
     
     
    void		Layout_DrawScene(Layout *this, Scene *scene, Point *position);
     
     
    #endif	/* _LAYOUT_H */

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #ifndef	H_SCENE
    #define	H_SCENE
     
    struct sScene;
     
    #include "layout.h"
    #include "character.h"
    #include "level.h"
     
     
    typedef struct sScene
    {
    	Layout		screen;
    	Level		level;
    	Character	player;
    } Scene;
     
     
    #endif	/* _SCENE_H */
    Jc

  3. #3
    b4u
    b4u est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut
    non, toujours Expected specifier-qualifier-list before 'Layout' au moment de compiler

  4. #4
    b4u
    b4u est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut
    finalement je m'en suis sorti en remplaçant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include "point.h"
    #include "plane.h"
    #include "scene.h"
     
     
    typedef struct
    {
    	Plane		plane;
    	Plane		scrollable;
    	Point		refresh;
    	void		*memory;
    } Layout;
     
     
    void		Layout_DrawScene(Layout *this, Scene *scene, Point *position);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include "point.h"
    #include "plane.h"
     
    struct sScene;
     
    typedef struct
    {
    	Plane		plane;
    	Plane		scrollable;
    	Point		refresh;
    	void		*memory;
    } Layout;
     
     
    void		Layout_DrawScene(Layout *this, struct sScene *scene, Point *position);
    Maintenant, est-ce qu'il existe un moyen pour que le prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void		Layout_DrawScene(Layout *this, struct sScene *scene, Point *position);
    devienne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void		Layout_DrawScene(Layout *this, Scene *scene, Point *position);
    ?

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par b4u
    Maintenant, est-ce qu'il existe un moyen pour que le prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void		Layout_DrawScene(Layout *this, struct sScene *scene, Point *position);
    devienne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void		Layout_DrawScene(Layout *this, Scene *scene, Point *position);
    ?
    Ben, tu fais un typedef struct au lieu de struct. Tu as su le faire pour Layout et Point, non?
    Sinon, pour ton probleme d'inclusion, je ferai un fichier entete par type exporte (Layout, Scence et Point) et j'incluerais chaque type dont on a besoin pour le prototype de la fonction.

  6. #6
    b4u
    b4u est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut
    Ben, tu fais un typedef struct au lieu de struct
    tu veux dire, je redéfinis le type Scene (déja défini dans le second header du premier post, scene.h)?
    la "définition incomplète" (je ne connais pas le terme précis - forward definition je crois) n'est utile que pour remplacer un dans layout.h (qui lui meme inclut layout.h, et c'est bien ça le probleme), pour que le prototype de la fonction Layout_DrawScene() puisse etre compilé (vu que celle-ci prend en paramètre un pointeur vers Scene)... enfin, je n'ai peut-etre pas bien compris ce que tu me suggères.
    Sinon, pour ton probleme d'inclusion, je ferai un fichier entete par type exporte (Layout, Scence et Point) et j'incluerais chaque type dont on a besoin pour le prototype de la fonction.
    je ne vois pas bien, tu pourrais me donner un exemple rapide s'il te plait?
    merci

  7. #7
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par b4u
    tu veux dire, je redéfinis le type Scene (déja défini dans le second header du premier post, scene.h)?
    Il faut que les deux types soient coherent. Si tu fais un
    d'un cote, tu es oblige de faire un de l'autre. Ce que je proposais, c'est de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct sScene { ... } tScene;
    dans scene.h histoire de ne pas avoir a trainer un struct partout.

    Citation Envoyé par b4u
    je ne vois pas bien, tu pourrais me donner un exemple rapide s'il te plait?
    Je proposais d'isoler les definitions de type des prototypes de fonction:
    Ton scene.h devient t_scene.h (pour indiquer que c'est une definition de type uniquement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #ifndef	H_T_SCENE
    #define	H_T_SCENE
     
    #include "t_layout.h"
    #include "character.h"
    #include "level.h"
     
     
    typedef struct
    {
    	Layout		screen;
    	Level		level;
    	Character	player;
    } Scene;
     
     
    #endif
    ton layout.h devient t_layout.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #ifndef	H_T_LAYOUT
    #define	H_T_LAYOUT
     
    #include "point.h"
    #include "plane.h"
     
    typedef struct sLayout
    {
    	Plane		plane;
    	Plane		scrollable;
    	Point		refresh;
    	void		*memory;
    } Layout;
     
    #endif
    Remarque que t_layout.h ne depend plus de t_scene.h -> on est tranquille.
    Et le prototype de ta fonction, dans layout.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef	H_LAYOUT
    #define	H_LAYOUT
     
    #include "point.h"
    #include "t_layout.h"
    #include "t_scene.h"
     
    void Layout_DrawScene(Layout *this, Scene *scene, Point *position);
     
    #endif
    Ensuite, si le contenu des typedefs est cense etre prive a la fonction Layout_DrawScene, alors tu peux definir des types incomplets, et completement oublier les inclusions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef	H_LAYOUT
    #define	H_LAYOUT
     
    typedef struct sPoint Point;
    typedef struct sScene Scene;
    typedef struct sLayout Layout;
     
    void Layout_DrawScene(Layout *this, Scene *scene, Point *position);
     
    #endif
    Mais la, l'utilisateur de la fontion Layout_DrawScene n'a aucun moyen de connaitre le contenu des structures. Du coup, il faut creer un 'constructeur' pour chaque structure, etc. C'est ce qu'on appelle un Abstract Data Type ).

  8. #8
    b4u
    b4u est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut
    ok merci beaucoup pour ta réponse détaillée, c'est exactement ce qu'il me fallait
    je vais étudier ça en détail
    Du coup, il faut creer un 'constructeur' pour chaque structure, etc.
    ça tombe bien, c'est justement ce que j'ai actuellement pour chacune de mes structures. En fait j'essaye d'avoir au maximum un code qui sépare implémentation et interface, comme pour un langage objet (pour qu'il soit facilement maintenable, réutilisable par module etc.), le tuto que tu m'a indiqué devrait bien m'aider

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/04/2006, 17h08
  2. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  3. Problème d'inclusions multiples
    Par Le Furet dans le forum C
    Réponses: 2
    Dernier message: 03/10/2005, 23h59
  4. Problème d'inclusion de pages.
    Par julien85 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 01/05/2005, 18h06
  5. Problème d'inclusion
    Par degreste dans le forum MFC
    Réponses: 5
    Dernier message: 27/01/2004, 00h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo