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 :

Utilisation de variables "extern" fastidieuses!


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Utilisation de variables "extern" fastidieuses!
    Salut!

    Voila j'ai un projet contenant plusieurs fichiers :

    - main.c
    - main.h
    - main_ext.h
    - fonctions.c
    - fonctions.h
    - ...

    Mon problème c'est que pour éviter le 'multi define' j'ai fais une copie du fichier main.h nommé main_ext.h qui comme son nom l'indique correspond au même variable de main.h mais défini en extern.
    Ce qui m'embète c'est qu'au bout d'un moment sa devient pénible de devoir éditer 2 fichiers pour faire une modification (en plus d'être rapidement une source d'erreur!). je me demandais donc s'il n'y avait pas un autre moyen pour éviter le 'multi define' ou pour remplacer/générer mon main_ext.h.

    merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pas à ma connaissance: Une variable globale doit être déclarée dans un fichier d'en-tête et définie dans un fichier source dédié.

    Je ne vois aucune alternative.
    Ah si! Comment ai-je pu oublier celle-là:
    Ne pas utiliser de variables globales.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Fondamentalement, même avis que Médinoc: éviter les variables externes. Passer par une interface fonctionnelle.
    Sinon, pour un pansement sur une jambe de bois bancale :
    dans main.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef _D_MAIN_IMPL_
    #define _D_MAIN_EXPORT_	extern
    #else
    #define _D_MAIN_EXPORT_
    #endif
     
    _D_MAIN_EXPORT_ int g_Main_iMaVariable ;
    Dans ton main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define _D_MAIN_IMPL_
    #include "main.h"
    Dans un autre.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* Pas de définition de _D_MAIN_IMPL_ */
    #include "main.h"

  4. #4
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    mais normalement tu peut faire une include dans le fichier main_ext.h

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef MAIN_EXT_H
    #define MAIN_EXT_H
     
    #include "main.h"
     
    .....
     
    #endif // MAIN_EXT_H
    "La créativité est faites d'attention et de respect pour les petits faits de la vie."

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    @ Médinoc : en faite c'est de la programmation sur dspic, le programme est assez volumieux et doit contenir l'état de pas mal de capteurs, servos, moteurs,....bref je ne peux pas me permettre de passer toutes ces infos dans les fonctions par des paramètres...même si tout est bien organisé à l'aide de structures,... le code deviendrait illisible

    @ 3DArchi : merci pour cette solution mais le 'multi define' revient

    @ cmoibal : si je fais ça j'ai un problème de 'multi define'....

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    OK, si c'est de l'embarqué ça s'excuse
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pas à ma connaissance: Une variable globale doit être déclarée dans un fichier d'en-tête et définie dans un fichier source dédié.
    Non, ce n'est pas obligé

    Il suffit que tu les définissent en local dans le main, et en externes dans le .h inclus dans les autres fichiers...

    Cependant, dans ce cas, cela évite bien le multi define, mas c'est moins joli et maintenable. Mais ton affirmation est fausse. C'est juste de la bonne pratique..

    Citation Envoyé par Médinoc Voir le message
    Je ne vois aucune alternative.
    Ah si! Comment ai-je pu oublier celle-là:
    Ne pas utiliser de variables globales.
    Là 100% d'accord

    Maintenant, en ce qui concerne l'embarqué, je ne vois pas trop ce qui empêcherait de faire appel à des paramètres d'une structure passée en paramètre....

    Ce que je ferais dans ce cas c'est (à condition d'avoir un minimum de mémoire) de stocker tous les paramètres "globaux" dans une structure, et soit de la passer en paramètres aux fonctions des autres modules (le plus élégant et correct), soit, plus simple mais moins élégant et moins correct, de faire une fonction qui stocke localement l'adresse de la structure dans chaque module.

    Ainsi, la seule définition globale serait la définition de la structure (donc pas de multi-define), et ce serait "relativement" dynamique (l'adresse serait par exemple stockée dans une variable globale à chaque module..)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Maintenant, en ce qui concerne l'embarqué, je ne vois pas trop ce qui empêcherait de faire appel à des paramètres d'une structure passée en paramètre....
    Comme tu l'as évoqué la mémoire peut être un soucis sur des microcontroleurs de faible mémoire...du coup le code devient difficilement portable par la suite. Je suis totalement d'accord avec vous, il faut éviter les variables globales (d'ailleurs si c'était un programme win32 je n'aurais même pas ouvert ce topic^^), mais dans le cas que je suis entrain de traiter, je ne peux me permettre d'envoyer à une fonction (et il n'y en a pas qu'une ) une structure globale par exemple, vous n'imaginez même pas la taille de la structure et le manque de praticité (puis surtout pour tout retoucher le code enormement long...).

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ben de toutes façons c'est global.

    Donc tu as tous tes paramètres en mémoire.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Une question : en quoi le multi-define te gène ? D'autant, que j'avoue ne pas voir beaucoup d'autres solutions : soit tu gère deux fichiers à la main (et risque de divergence/erreur), soit tu utilises le multi-define (ce qui 'conceptuellement' revient à gérer deux fichiers par le compilateur).

  11. #11
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    @souviron34 : Ne pouvant changer toute la forme du programme pour y intégrer une structure globale je suis obliger de trouver une solution avec la forme actuelle

    @3DArchi : Et bien le multi define me dérenge parce que cela provoque des erreurs lors de la compilation...

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Bonsoir,

    Je n'ai pas tout compris.

    Dans un .h ne devraient figurer que les # define, des extern, et des déclarations de prototypes de fonctions.

    Fonctions et variables déclarées extern devront figurer dans un seul fichier .c - sinon, çà va raler "multi-define".

    Donc plutôt que:
    Mon problème c'est que pour éviter le 'multi define' j'ai fais une copie du fichier main.h nommé main_ext.h qui comme son nom l'indique correspond au même variable de main.h mais défini en extern.

    Il faudrait déplacer nombre de déclarations de variables dans un .c et ne garder dans le .h que les extern.

    Qu'est ce que j'ai loupé?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par LeNoob Voir le message
    Ce qui m'embète c'est qu'au bout d'un moment sa devient pénible de devoir éditer 2 fichiers pour faire une modification (en plus d'être rapidement une source d'erreur!). je me demandais donc s'il n'y avait pas un autre moyen pour éviter le 'multi define' ou pour remplacer/générer mon main_ext.h.

    merci pour votre aide.
    Cela ne serait pas plus judicieux de faire des .lib de codes ou bibliothèques liées statiquement ?

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Qu'est ce que j'ai loupé?
    - W
    Dans ce cas, au lieu de gérer un main.h et un main_ext.h, il y aura une définition dans main.h et une déclaration dans main.c: à nouveau le problème de redondance....

    LeNoob: Je ne comprends par ton problème de compil. Pourrais-tu être plus précis. Peut-être la solution que tu as adopté n'était pas adapté à l'erreur que tu avais.

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Dans ce cas, au lieu de gérer un main.h et un main_ext.h, il y aura une définition dans main.h et une déclaration dans main.c: à nouveau le problème de redondance....
    ...
    Merci pour cette explication.

    L'utilisation des "# define" que vous avez suggéré précédemment est une solution.

    Je crois que plus fondamentalement, ce qui me gène c'est que les headers définissent les interfaces et éventuellement des variables globales.
    A priori, ce sont des parties "stables" pour autant qu'on ait arrêté le "design".

    Si on designe au fil de l'eau (ce n'est pas un reproche, parfois il faut explorer), normal que ces frontières bougent.

    Dans ce cas, il est peut être sage d'attendre que le design de la chose se dégage avant de s'amuser à découper cela en modules.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [awk] Utilisation de variables externes
    Par soulhouf dans le forum Shell et commandes GNU
    Réponses: 18
    Dernier message: 10/06/2013, 13h41
  2. Réponses: 3
    Dernier message: 20/01/2007, 20h36
  3. Utilisation variable globale, extern...
    Par mamok dans le forum MFC
    Réponses: 3
    Dernier message: 29/03/2006, 10h50

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