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 :

pb typedef struct commun a plusieurs sources


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 23
    Points : 21
    Points
    21
    Par défaut pb typedef struct commun a plusieurs sources
    J'ai un problème avec typedef, voici grosso modo la structure de mon petit projet

    main.c

    #include "main.h"

    ... du code ....
    main.h

    #ifndef _main
    #define _main
    typedef struct
    {
    Int32 ma_variable;

    } ma_structure;
    #endif
    test.c

    #include "main.h"
    #include "test.h"

    void essai(ma_structure *ptr)
    {
    ptr->ma_variable = 0;
    }
    test.h

    #ifndef _test
    #define _test

    void essai(ma_structure *ptr);

    #endif
    Quand je compile j'ai une erreur dans test.h sur ma_structure qui n'est pas reconnu, si je déplace le prototype dans test.c, ça marche.
    Si je recopie la definition de ma_structure dans test.h ça marche aussi.

    Y a pas une solution pour avoir une seule déclaration de ma_structure et surtout laisser le prototype essai dans test.h car j'en aurais besoin dans d'autres sources ?

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2005
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 513
    Points : 416
    Points
    416
    Par défaut
    si tu fais:
    dans test.h, tu ne devrais plus avoir de problème !
    Jérémy
    Ingénieur Conception et Développement

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: pb typedef struct commun a plusieurs sources
    Citation Envoyé par albedo
    J'ai un problème avec typedef, voici grosso modo la structure de mon petit projet

    main.c

    #include "main.h"
    Je le sens mal. main.c contient en général main(), qui est le point d'entrée du programme. Il n'y a donc, en principe, rien à exporter...
    ... du code ....
    main.h

    #ifndef _main
    #define _main
    typedef struct
    {
    Int32 ma_variable;

    } ma_structure;
    #endif
    Et Int32, c'est défini où ? Un header doit être autonome. Il doit inclure tout ce qui lui est nécessaire (les 'guards' sont là pour faire la police).

    test.c

    #include "main.h"
    #include "test.h"

    void essai(ma_structure *ptr)
    {
    ptr->ma_variable = 0;
    }
    test.h

    #ifndef _test
    #define _test

    void essai(ma_structure *ptr);

    #endif
    Pareil ici. 'ma_structure' n'est pas défini. C'est ici qu'il faudrait inclure le header qui contient sa définition... En fait, la structure devrait être 'liée' (sur le plan conceptuel) au code qui sert à traiter les données qui vont avec. La définition de la structure devrait donc être dans le même fichier (ici, test.h) que celui qui déclare la fonction (ici essai()).

    La répartition des informations dans les fichiers ne se fait pas au hasard, mais selon des regles de conception bien précises. Par exemple :

    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser

    Quand je compile j'ai une erreur dans test.h sur ma_structure qui n'est pas reconnu, si je déplace le prototype dans test.c, ça marche.
    Si je recopie la definition de ma_structure dans test.h ça marche aussi.

    Y a pas une solution pour avoir une seule déclaration de ma_structure et surtout laisser le prototype essai dans test.h car j'en aurais besoin dans d'autres sources ?
    Je conseille ceci :
    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
     
    /* main.c */
     
    #include <stdio.h>
    #include "mon_obj.h"
     
    int main (void)
    {
       mon_obj obj =
       {0};
     
       printf ("obj.mon_champ = %lu \n", (unsigned long) obj.mon_champ);
     
       mon_obj_essai (&obj);
     
       printf ("obj.mon_champ = %lu \n", (unsigned long) obj.mon_champ);
     
       return 0;
    }
    avec
    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
     
    #ifndef H_MON_OBJ
    #define H_MON_OBJ
     
    /* mon_obj.h */
     
    typedef unsigned long Int32;
     
    typedef struct
    {
       Int32 mon_champ;
    }
    mon_obj;
     
    void mon_obj_essai (mon_obj * ptr);
     
    #endif
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* mon_obj.c */
     
    #include "mon_obj.h"
     
    void mon_obj_essai (mon_obj * ptr)
    {
       ptr->mon_champ = 123;
    }
    Pour aller plus loin :

    http://emmanuel-delahaye.developpez.com/tad.htm

    à garder sous le coude, et à voir dans quelques temps. C'est peut être un peu tôt...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Merci pour la rapidité de vos réponses

    En fait si je comprends bien l'idéal serait d'avoir un .h uniquement pour mes declarations typedef et de l'inclure dans les .h de chacune de mes sources ?

    En tout cas j'ai essayé et c'est bon, merci.


    PS : c'est sous codewarrior pour palm os , ne pas faire attention au Int32...

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut Re: pb typedef struct commun a plusieurs sources
    Citation Envoyé par Emmanuel Delahaye
    Pareil ici. 'ma_structure' n'est pas défini. C'est ici qu'il faudrait inclure le header qui contient sa définition...
    Taratata. Elle est tout a fait definie, puisque main.h a ete inclus dans test.c avant test.h. D'accord, ce n'est pas tres pratique, mais c'est tout a fait correct. Cela ne devrait pas produire d'erreur.
    J'ai d'ailleurs verifie avec main.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef H_MAIN
    #define H_MAIN
     
    typedef struct
    {
      int my_var;
    } my_struct;
     
    #endif
    puis test.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef H_TEST
    #define H_TEST
     
    void essai(my_struct *ptr);
     
    #endif
    et test.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "main.h"
    #include "test.h"
     
    void essai(my_struct *ptr)
    {
      ptr->my_var = 0;
    }
    et cela marche.
    Evidemment (dans le passe, il etait meme conseille qu'aucun header n'inclut un autre header. Ce temps est revolu, heureusement).
    Donc albedo, ton erreur doit etre sur le Int32 non defini.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: pb typedef struct commun a plusieurs sources
    Citation Envoyé par DaZumba
    Citation Envoyé par Emmanuel Delahaye
    Pareil ici. 'ma_structure' n'est pas défini. C'est ici qu'il faudrait inclure le header qui contient sa définition...
    Taratata. Elle est tout a fait definie, puisque main.h a ete inclus dans test.c avant test.h. D'accord, ce n'est pas tres pratique, mais c'est tout a fait correct. Cela ne devrait pas produire d'erreur.
    Bien sûr que ça marche, mais c'est horrible. Il n'y a aucune raison de séparer la définition des structures et la déclarations des fonctions publiques de base (pour les fonctions internes, ou des fonctions applicatives de haiut niveau, c'est autre chose).

    Une meilleure organisation résout tous ces problèmes d'un coup. C'est sur ce point que je voulais insister.

    Citation Envoyé par Emmanuel Delahaye
    Un header doit être autonome. Il doit inclure tout ce qui lui est nécessaire (les 'guards' sont là pour faire la police).
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 23
    Points : 21
    Points
    21
    Par défaut Re: pb typedef struct commun a plusieurs sources
    Citation Envoyé par DaZumba
    Albedo, ton erreur doit etre sur le Int32 non defini.
    Non ce n'est pas le Int32, sous codewarrior une telle organisation ne passe pas, pourtant j'aurais aussi cru que celà fonctionnerai.
    Je connais pas CW sur le bout des doigts mais l'important c'est que ça marche.

    J'ai fait un .h avec tous mes typedef que j'inclus la ou ça va bien. Donc problème résolu

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

Discussions similaires

  1. [MFC] objet commun a plusieurs classes
    Par Info42 dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2006, 18h52
  2. typedef struct
    Par moon93 dans le forum C
    Réponses: 3
    Dernier message: 10/05/2006, 11h22
  3. Réponses: 2
    Dernier message: 24/05/2005, 16h35
  4. [JSP]session commune a plusieurs users!!!!
    Par Verbal-Quint dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 30/01/2004, 16h45
  5. Objet commun a plusieur DLL
    Par petitcoucou31 dans le forum Langage
    Réponses: 2
    Dernier message: 10/12/2003, 22h07

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