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

MFC Discussion :

Problème avec deux structs dans deux fichiers .h


Sujet :

MFC

  1. #1
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut Problème avec deux structs dans deux fichiers .h
    Bonjour tout le monde,

    j'ai deux fichiers .h qui contiennent deux structures différentes (st1 dans file1 et st2 dans file2). Chacun de ces deux fichiers a un include sur l'autre. J'aimerais déclarer une variable de type st1 dans file2 mais j'y arrive pas.

    Un petit bout de code est plus parlant:

    file1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef _FILE1
    #define _FILE1
     
    #include "file2.h"
     
    typedef struct ST1
    {
    	char	c1;
    }st1;
     
    #endif
    file2.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef _FILE2
    #define _FILE2
     
    #include "file1.h"
     
    typedef struct ST2
    {
    	char	c2;
    	st1 a; //<--- Problème
    }st2;
     
    #endif
    Les .cpp ne contiennent absolument rien (si ce n'est les includes aux .h correspondants).

    Merci d'avance pour votre aide
    "Don't think you are, know you are..." (Morpheus)

  2. #2
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Salut,

    Donne le message du compilo...

    [/code]

  3. #3
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Voilà:

    c:\test1\file2.h(10) : error C2146: syntax error : missing ';' before identifier 'a'
    c:\test1\file2.h(10) : error C2501: 'st1' : missing storage-class or type specifiers
    c:\test1\file2.h(10) : error C2501: 'a' : missing storage-class or type specifiers
    "Don't think you are, know you are..." (Morpheus)

  4. #4
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    C'est bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef _FILE1 
    #define _FILE1 
     
    //#include "file2.h"          mettre ceci en commentaire
     
    typedef struct ST1 
    { 
       char   c1; 
    }st1; 
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifndef _FILE2 
    #define _FILE2 
     
    #include "file1.h" 
     
     
    typedef struct ST2 
    { 
       char   c2; 
       st1 a; //<--- Problème 
    } st2; 
     
    #endif
    C'est OK

  5. #5
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    NON justement j'ai besoin des includes croisés, sinon ca aurait été trop facile

    Bien essayé quand même, mais ca résoud pas mon pbme...
    "Don't think you are, know you are..." (Morpheus)

  6. #6
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Sans les includes croisés quel est donc le pb :
    Quels sont les nouveaux messages d'erreurs...

  7. #7
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par Gabrielly
    Sans les includes croisés quel est donc le pb :
    Quels sont les nouveaux messages d'erreurs...
    Je ne veux pas enlever les includes croisées parce que j'en ai besoin. Donc en gros je dois pouvoir inclure les fichiers dans les deux sens et utiliser les deux structures dans les deux fichiers !!

    Sous builder je sais comment faire, il suffit de déclarer tout en haut du fichier que "ceci est une classe et le contenu viendra après", mais en Visual j'en ai aucune idée !
    "Don't think you are, know you are..." (Morpheus)

  8. #8
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Bon écoute voici ce que j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef _FILE1 
    #define _FILE1 
     
    #include "file2.h" 
     
    typedef struct ST1 
    { 
       char   c1; 
    }st1; 
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifndef _FILE2 
    #define _FILE2 
     
    #include "file1.h" 
     
     
    typedef struct ST2 
    { 
       char   c2; 
       ST1 a; //<--- Problème 
    }st2; 
     
    #endif
    fichier main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //#include "file.h"
    #include "file2.h"
     
     
    void main()
    {
     
    }
    le code se compile bien.
    Je crois que ça va

  9. #9
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    sinon, il faut prototype ton st1 avant de faire ton include de file2 :
    Comme file1 inclus pas de file2 tu peut faire comme suit :

    file1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    #ifndef _FILE1 
    #define _FILE1 
     
    typedef struct ST1 
    { 
       char   c1; 
    }st1;
    #include "file2.h"

    #endif



    file2.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef _FILE2 
    #define _FILE2 
     
    #include "file1.h" 
     
    typedef struct ST2 
    { 
       char   c2; 
       st1 a; //<--- Problème 
    }st2; 
     
    #endif
    Qui va piano va sano...

  10. #10
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Merci pour ta réponse matazz, effectivement là ca marche mais comme je l'ai dit je vais avoir besoin d'utiliser les deux structures dans les deux fchiers (mon exemple n'était pas complet).

    Ce que je voudrais avoir c'est un truc dans le genre:

    file1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef _FILE1
    #define _FILE1
     
    #include "file2.h"
     
    typedef struct ST1
    {
      int a;
      st2 b;   
    }st1;
     
    #endif
    file2.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef _FILE2
    #define _FILE2 1
     
    #include "file1.h"
     
    typedef struct ST2
    {
      int c;
      st1 d;
    }st2;
    #endif
    Merci pour votre aide...
    "Don't think you are, know you are..." (Morpheus)

  11. #11
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    alors dans se cas là tu a intéret à faire des classe car tu peut les prototypées :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef _FILE1 
    #define _FILE1 
     
    class Classe1;
     
    #include "file2.h" 
     
    class Classe1
    {
    Classe2 Cl2;
    ...
    }
     
    #endif


    file2.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
    #ifndef _FILE2 
    #define _FILE2 1 
     
    class Classe2;
     
    #include "file1.h" 
     
    class Classe2
    {
    Classe1 cl1;
    ...
    }
     
    #endif

    Je suis pas sur que tu puisse le faire avec des structs essaye un #define st2 avant ton include de File1.h, mais je ense que cela ne marchera pas....
    Qui va piano va sano...

  12. #12
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Et attend...

    A défaut d'inclure deux fichiers file1.h et file2.h tu inclus seulement file2.h car il reprend file1.h

    tu n'as pas vu le poste au dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //#include "file.h"                
    #include "file2.h" 
     
     
    void main() 
    { 
     
    }
    Chez moi ça se compile.

  13. #13
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Non désolé je ne peux pas passer en classe pour la simple et unique raison qu'il ne s'agit pas de mon code !! Donc j'essaye juste d'aider, mais si personne n'a une solution pour faire du forward declaration (qui et le cas dans ton exemple), alors il n'y a pas le choix que de tout mettre dans le .h...

    Merci quand même à tout ceux qui ont essayé..
    "Don't think you are, know you are..." (Morpheus)

  14. #14
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par Gabrielly
    Et attend...

    A défaut d'inclure deux fichiers file1.h et file2.h tu inclus seulement file2.h car il reprend file1.h

    tu n'as pas vu le poste au dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //#include "file.h"                
    #include "file2.h" 
     
     
    void main() 
    { 
     
    }
    Chez moi ça se compile.
    Désolé j'avais pas fais gaffe, mais je ne pense pas que ca résoudra mon problème (Regardes le deuxième exemple que j'ai posté, il est plus complet)...Je vais essayer quand même ;-)
    "Don't think you are, know you are..." (Morpheus)

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu as un problème de conception.

    st1 contient un st2 qui contient un st1 qui contient un st2 qui contient un st1 qui contient un st2 qui...

    Tu ne peux pas faire boucler les compositions comme ça, ça n'a aucun sens. Résoud cela et tu résoudra ton problème d'inclusions circulaires .

  16. #16
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par Loulou24
    Tu as un problème de conception.

    st1 contient un st2 qui contient un st1 qui contient un st2 qui contient un st1 qui contient un st2 qui...

    Tu ne peux pas faire boucler les compositions comme ça, ça n'a aucun sens. Résoud cela et tu résoudra ton problème d'inclusions circulaires .
    Oui je sais parfaitement que c'est pas normal, cependant deux choses s'imposent:
    - C'est quelque chose de réalisable avec les classes (même si c'est pas très beau)
    - Ce n'est pas mon code :-) Donc j'essaye juste d'apporter une aide sur l'existant. Et vu la taille du projet je pense que le mieux serait de mettre toutes les déclarations de structures dans un même fichier.
    "Don't think you are, know you are..." (Morpheus)

  17. #17
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    en tout cas avec de telles dépendances, il faudrait les mettre dans un seul fichier. Mais cela relève effectivement d'un problème de conception comme l'a dit Loulou24.
    Voit par exemple afxwin.h ou afxdb.h Les classes qui s'apparentent sont mises dans un même fichier.

    Bon courage et @+

  18. #18
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    - C'est quelque chose de réalisable avec les classes (même si c'est pas très beau)
    Absolument pas. Tes classes auraient une taille infinie. Pour que 2 classes se référencent l'une l'autre comme ça il faut quelque part au moins une référence ou un pointeur.

  19. #19
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par Loulou24
    - C'est quelque chose de réalisable avec les classes (même si c'est pas très beau)
    Absolument pas. Tes classes auraient une taille infinie. Pour que 2 classes se référencent l'une l'autre comme ça il faut quelque part au moins une référence ou un pointeur.
    Je peux très bien déclarer deux classes, et que chacune des deux classes contienne une instance ayant comme type l'autre classe. Cependant, et comme je l'ai dis, ceci est valable pour Builder mais je n'arrive pas à le faire avec Visual. Je vois aussi sur le net que pas mal de gens utilisent cette technique de coder pour des raisons quelqconques.

    Ce que j'ai déjà fait se résume en le suivant (toujours sous builder):

    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
     
    //File1
    #include "File2.h"
    class c2;
     
    class c1
    {
      c2 var2;
    };
     
     
    //File 2
    #include "File1.h"
    class c1;
     
    class c2
    {
     c1 var1;
    }
    Maintenant comment réaliser ceci avec Visual ? Sinon tant pis ! :-D
    "Don't think you are, know you are..." (Morpheus)

  20. #20
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut


    Comment veux-tu qu'une telle configuration soit possible... Prend une minute pour réflechir à ce que cela aurait comme conséquence sur tes 2 classes, notamment au niveau de leur taille, et mets-toi bien en tête que ceci est impossible à compiler.

    Citation Envoyé par Loulou24
    st1 contient un st2 qui contient un st1 qui contient un st2 qui contient un st1 qui contient un st2 qui...
    A ton avis ce petit jeu s'arrêterait quand ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème avec une commande dans un fichier .sh
    Par ploxien dans le forum Réseau
    Réponses: 8
    Dernier message: 19/03/2008, 11h55
  2. Réponses: 2
    Dernier message: 24/08/2007, 20h17
  3. rechercher et extraire deux chaines dans un fichier
    Par piotr dans le forum Langage
    Réponses: 16
    Dernier message: 13/07/2006, 15h07
  4. Réponses: 1
    Dernier message: 28/06/2006, 16h07
  5. Réponses: 9
    Dernier message: 25/09/2005, 16h33

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