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 :

[débutant]Organisation des déclarations de variables


Sujet :

C

  1. #1
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut [débutant]Organisation des déclarations de variables
    Bonjour,

    J'ai un problème d'organisation de déclaration de variable.
    J'ai créé une bibliothèque (.h) dans laquelle j'ai mis quelles fonctions et également la déclaration de structures avec un typedef pour chacune des structures.
    J'utilise ces structures dans mon pgm principal comme variables globales.

    Durant la compilation, j'ai un message signifiant que ces variables ( ex. LPAR[nb].Oid_value) n'e sont pas déclarées dans une fonction contenue dans le .h


    mon.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
     
    typedef struct IBM_LPAR_MIB IBM_LPAR_MIB;
    struct IBM_LPAR_MIB {     
           char Oid_value[30];
           char Lpar_name[12];
           char Cpc_name[12]; 
    };                        
    int GetMibLpar( char *Cmdsnmp) {   
        ~~
        while(pword !=NULL) {                         
         if (a==0) {                              
            strcpy(LPAR[nb].Oid_value,(pword+27)); 
            a=a+1;                                
         } else {                                 
           ~~
         }
    }
    Le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "mon.h"
    ~~
    ~~
    IBM_LPAR_MIB   LPAR[300];
    int main(int argc, char *argv[]) 
    {                                
     ~~
    return 0;
    }
    Ma question: dois je placer mes déclarations de variables globales avant l'include de mon.h, ou existe t'il une autre méthode plus approriée ?
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Du code dans un [dot]h ....




    declare tes globales en extern dans ton [dot]h

    ton [dot]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 __TON_H__
    #define __TON_H__
    typedef struct  s_ta_struct
    {
    int foo;
    char bar;
    }t_ta_struct;
     
    extern t_ta_struct ta_struct;
     
    #endif /*__!TON_H__ */
    ton [dot]c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    #include "ton.h"
    t_ta_struct ta_struct;
     
    int main(int ac, char **av)
    {
    ...;
    return (0);
    }

  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
    Citation Envoyé par SPACHFR Voir le message
    Ma question: dois je placer mes déclarations de variables globales avant l'include de mon.h, ou existe t'il une autre méthode plus approriée ?
    Il y a quelques règles simples à respecter pour organiser son code. Ca commence par écrire des .h corrects :
    • Protection contre les inclusions multiples
    • Uniquement des prototypes de fonctions et ce qu'il faut pour les définir (includes, macros, constantes, types)
    • pas de code, pas de variables

    Ensuite, se pose la pertinence des variables globales. C'est rarement le cas et la programmation par contexte (structure, pointeurs sur structures) permet d'écrire du code plus fiable et plus lisible.

    A lire de A à Z... : http://emmanuel-delahaye.developpez.com/codage.htm

    Si néanmoins, tu tiens aux globales, fait le correctement :

    http://emmanuel-delahaye.developpez....s.htm#globales
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre averti Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Points : 400
    Points
    400
    Par défaut
    Merci pour vos réponses.
    Je n'avais pas mis la partie de code contre les inclusions multiples dans l'exemple de mon message, mais c'est codé dans mon fichier .h (d'ailleurs pas très bien au vue de vos exemples....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #if !defined (ZCMNG_H)   
    #define ZCMNG_H          
    #endif   
    ~~
    Je vais corriger est prendre la régle donnée dans : http://emmanuel-delahaye.developpez.com/codage.htm.

    Pour les variables globales, j'ai pas trouvé d'autre solution simple( je fais de l'auto-formation ...seul dans mon coin).
    Si j'ai bien compris les propos concernant l'organisation des variables globales
    je fais un fichier de déclaration (.h)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* H_SP_MIB_20071203.h */
     
    #if !defined (H_SP_MIB_20071203)   
    #define H_SP_MIB_20071203   
    typedef struct IBM_LPAR_MIB IBM_LPAR_MIB;
    struct IBM_LPAR_MIB {     
           char Oid_value[30];
           char Lpar_name[12];
           char Cpc_name[12]; 
    };     
    extern IBM_LPAR_MIB LPAR[300];                     
    #endif
    Un fichier .c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /* H_SP_MIB_20071203.c */
    #include "H_SP_MIB_2071203"
    IBM_LPAR_MIB LPAR[300];
    pgm principal .c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "H_SP_MIB_20071203.h"
    int main(void) {
    int a=0;
    char cmd[50]="";
    ~~
    a =GetMibLpar(cmd);
    ~~
    return 0;
    }
    Cependant j'ai toujours un doute concernant la place de ma fonction. Vue les régles données (pas de code, pas de variable dans les .h) ou dois je placer ma fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int GetMibLpar( char *Cmdsnmp) {   
        ~~
        while(pword !=NULL) {                         
         if (a==0) {                              
            strcpy(LPAR[nb].Oid_value,(pword+27)); 
            a=a+1;                                
         } else {                                 
           ~~
         }
    }
    doit elle être dans le H_SP_MIB_20071203.c, et le prototype de celle-ci dois t'il être dans le pgm principal ?
    Désolé Emmanuel, j'ai relu plusieurs fois mais j'ai pas trouvé (probablement pas compris) où déclarer ma fonction.
    S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

  5. #5
    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
    Citation Envoyé par SPACHFR Voir le message
    Pour les variables globales, j'ai pas trouvé d'autre solution simple( je fais de l'auto-formation ...seul dans mon coin).
    Si j'ai bien compris les propos concernant l'organisation des variables globales
    je fais un fichier de déclaration (.h)
    Astuce : Dans le fichier .c, tu peux omettre la taille du tableau :
    car elle est déclarée dans le .h. Il est toujours plus facile de maintenir du code dont les définitions sont uniques (une seule fois '300' et non 2 fois...)
    Cependant j'ai toujours un doute concernant la place de ma fonction. Vue les régles données (pas de code, pas de variable dans les .h) ou dois je placer ma fonction ?
    A l'évidence dans un .c
    et le prototype de celle-ci dois t'il être dans le pgm principal ?
    il doit être défini dans un .h, inclus dans le .c qui définit la fonction et dans les .c qui l'utilisent.

    Tout cela n'est pas du hasard ou un dogme quelconque. C'est du simple bon sens... "Tout ce qui est utilisé doit avoir été déclaré au préalable".
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. [ZF 1.9] [Débutant] Organisation des contrôleurs
    Par nosferapti dans le forum MVC
    Réponses: 3
    Dernier message: 10/01/2010, 13h53
  2. [C#.NET][Débutant]Portée des variables
    Par Xzander dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/07/2006, 18h29
  3. [débutant] initialisation des variables.
    Par zui dans le forum Langage
    Réponses: 1
    Dernier message: 05/06/2006, 15h29
  4. Réponses: 4
    Dernier message: 04/06/2006, 16h53
  5. [JSP][débutant] recupérer des variables...
    Par yass dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 08/04/2004, 11h05

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