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 :

variable globale et fichiers séparés


Sujet :

C++

Vue hybride

sluke variable globale et fichiers... 26/01/2007, 11h58
Laurent Gomila Ta variable globale est... 26/01/2007, 15h04
Ulmo Le "extern" dit que la... 26/01/2007, 15h04
sluke En fait, l'histoire du " Data... 26/01/2007, 20h41
Laurent Gomila N'empêche qu'il faut tout de... 26/01/2007, 22h38
sluke Ok, je pensais que le fait de... 27/01/2007, 10h46
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut variable globale et fichiers séparés
    Bonjour,

    Je fais actuellement un programme en C++ objet et depuis que j'ai inclus une variable globale, j'ai des problèmes de compilation. J'ai fait quelques recherches sur le forum mais rien n'a pu résoudre mon problème. Pour résumé la situation, j'ai fait un petit programme (il ne sert à rien et n'est pas "propre", alors avis aux puristes ) qui recrée l'erreur :

    Retour de make :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    g++ -c Main.cc -o Main.o -g
    g++ -c Data.cc -o Data.o -g
    g++ -c Traitement.cc -o Traitement.o -g
    g++ -o essai Main.o Data.o Traitement.o -g
    Traitement.o: dans la fonction « Traitement::affiche()     »:
    essai_cpp/Traitement.cc:12: référence indéfinie vers « globale_data »
    collect2: ld returned 1 exit status
    make: *** [essai] Erreur 1


    Voici le code :

    Main.cc
    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
     
    #include "Main.h"
    #include "globale.h"
    #include "Data.h"
     
    int main()
    {
        int tab[6] = {1,2,3,4,5,6};
        Data *d = new Data(tab,10);
     
        Data *globale_data = d;
     
    Traitement *t = new Traitement();
        t->affiche();
     
     
    }
    Data.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 DATA_H
    #define DATA_H
     
    class Data
    {
        private:
        int nb[6];
        int res;
     
        public:
        Data(int *nb, int res);
     
        void affiche();
    };
    #endif
    Traitement.cc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "globale.h"
    #include "Data.h"
    #include "Traitement.h"
     
    Traitement::Traitement()
    {
        i = 0;
    }
     
    void Traitement::affiche()
    {
        globale_data->affiche();
    }
    globale.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef GLOBALE_H
    #define GLOBALE_H
    #include "Data.h"
     
    extern Data *globale_data;
     
    #endif
    Je ne comprends pas pourquoi le linker ne trouve pas la référence de la variable globale. Si quelqu'un a une idée ...

    Merci d'avance

  2. #2
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ta variable globale est déclarée, mais définie nulle part. D'autant plus que tu en redéclares une du même nom dans ton main().

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par sluke
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern Data *globale_data;
    Le "extern" dit que la variable est existe mais qu'elle est instanciée ailleurs. Il faut maintenant la faire apparaître, typiquement dans un globale.cpp :
    [QUOTE=sluke]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Data *globale_data;
    qui lui ne doit pas inclure globale.h.

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut
    En fait, l'histoire du " Data *globale_data = d;" dans Main.cc, vient de ce cours :


    http://www.ensta.fr/~enstar/doc/c++/courscpp/Sections/Sect10-D0.html


    Pour moi, la variable globale_data est définie dans "globale.h" et elle est initialisée dans "Main.cc" et réutilisée dans "Traitement.cc". C'est ça mon but en fait.
    Logiquement j'aurai mis : "globale_data = d;" dans Main.cc mais ça ne compile pas non plus...

    Le "extern" dit que la variable est existe mais qu'elle est instanciée ailleurs. Il faut maintenant la faire apparaître, typiquement dans un globale.cpp :
    En fait, le but n'est pas de créer un "globale.cpp". Le but est d'initialiser et d'affecter les variables dans n'importe quel fichier .cc

  5. #5
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En fait, le but n'est pas de créer un "globale.cpp". Le but est d'initialiser et d'affecter les variables dans n'importe quel fichier .cc
    N'empêche qu'il faut tout de même définir ta variable dans un fichier cpp.

    http://c.developpez.com/faq/c/?page=...TYPES_globales

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut
    Ok, je pensais que le fait de mettre "extern Data *globale_data" suffisait dans le globale.h

    Merci à tous pour votre aide

    bye

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

Discussions similaires

  1. variable globale et fichier txt
    Par zn415 dans le forum Flash
    Réponses: 1
    Dernier message: 28/08/2008, 15h59
  2. variables globales et fichiers de sauvegarde
    Par AlfredKr dans le forum C++/CLI
    Réponses: 2
    Dernier message: 15/09/2006, 17h12
  3. variable global fichier externe?
    Par molesqualeux dans le forum C
    Réponses: 4
    Dernier message: 01/02/2006, 16h13
  4. Réponses: 6
    Dernier message: 19/01/2006, 22h52
  5. Variables globales dans fichiers entête
    Par benj_f04 dans le forum C++
    Réponses: 5
    Dernier message: 13/08/2004, 09h06

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