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 :

Problème de variables globales


Sujet :

C++

  1. #1
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut Problème de variables globales
    Bonjour à tous,

    voilà j'ai un petit problème de définition avec une variable globale; voici la configuration de mon projet :

    un fichier GraphicalTemplates.h (avec prototypes de fcts et la déclaration d'une variable globale floor1)
    un fichier graphicalTemplates.cpp (qui va entre autres donner une valeur à floor1)

    un fichier Object3D.h
    un fichier Object3D.cpp (qui va utiliser floor1)


    J'importe bien dans Object3D.cpp son header ainsi que GraphicalTemplates.h mais à la compilation ça plante il me met :

    multiples definitoons of 'floor1'
    first defined here


    Et pourtant c'est bien le seul endroit où j'utilise floor1...
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    Salut mets dans un seul .c
    et dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    extern type floor1;

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Peux tu nous fournir ton code ? Sans savoir comment tu fais les choses, c'est impossible de t'aider correctement.
    Ensuite les déclaration 'extern' , ca fait plutôt "C" (et non C++).

  4. #4
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Dans GraphicalTemplates.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include<...>
     
    GLuint floor1;
     
    ...
     
    void loadTextures();
     
    ...
    GraphicalTemplates.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    #include "GraphicalTemplates.h"
     
    ...
     
    void loadTextures()
    {
        //ici je donne une valeur à floor1
    }
     
    ...
    dans Object3D.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    void drawCube();
    ...
    dans Object3D.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include<Object3D.h>
     
    ...
    void drawCube()
    {
        //ici j'utilise la valeur donnée à floor1
    }
    ...

    en gros dans ma main je fais à un moment loadTextures() et ensuite drawCube().

    Mais voilà même en mettant extern dans Graphicaltemplates.h ça compile pas...
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  5. #5
    Membre averti Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Points : 332
    Points
    332
    Par défaut
    pour ton .h il faut peu être mettre un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef _GraphicalTemplates_
    #define _GraphicalTemplates_
     
    // tout ton code
     
    #endif
    car là si tu lis plusieurs fois ce fichier .h dans d'autres fichier tu peux avoir ce genre de soucis je pense...

    sinon la solution de "alskaar" devrait aussi marcher
    Pensez aux tutoriels programmation : http://programmation.developpez.com/cours-tutoriels/

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Tu la déclare dans le cpp et pas de le header


    et dans le header tu la déclare extern

    Code h : Sélectionner tout - Visualiser dans une fenêtre à part
    extern GLuint floor1;

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par G-OnZa
    Peux tu nous fournir ton code ? Sans savoir comment tu fais les choses, c'est impossible de t'aider correctement.
    Ensuite les déclaration 'extern' , ca fait plutôt "C" (et non C++).
    désolé si extern ca fait C mais c'est le mot clef!
    par contre tu peux proposer une methode pour eviter les globales

  8. #8
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    par contre tu peux proposer une methode pour eviter les globales
    Si vraiment tu veux une variable accessible par tout le monde mais que tu souhaites éviter de déclarer comme ça, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*Fichier .h*/
     
    GLuint getFloor();
    void    setFloor(GLuint);
    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
     
    /* Fichier cpp*/
    #include "lefichierhpp"
     
    static GLuint floor1 =  0;
     
     
    GLuint getFloor()
    {
     return floor1;
    }
     
    void    setFloor(GLuint machin)
    {
     floor1 = machin;
    }
    Mais bon, ce n'est qu'une astuce (une pseudo-méthode on va dire car ça reste équivalent à avoir une variable globale). Retirer totalement le fait d'avoir une variable globale ne pourra se faire que si je comprend exactement pourquoi tu en as besoin
    Je ne répondrai à aucune question technique en privé

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par Bob.Killer
    pour ton .h il faut peu être mettre un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef _GraphicalTemplates_
    #define _GraphicalTemplates_
     
    // tout ton code
     
    #endif
    car là si tu lis plusieurs fois ce fichier .h dans d'autres fichier tu peux avoir ce genre de soucis je pense...

    l'utilisation des ifdef ... ne permet pas de resoudre le pb
    un include correspond a recopier le code du .h au debut de ton fichier
    c'est l'une des tache de la précompilation

    le fait de mettre une definition d'une variable ou d'une fonction dans un .h
    amenera forcement a un conflit lors du link des N fichiers .o qui correspondent au N fichiers de codes (enfin, l'utilisation de static peut etre une solution mais ne repondra pas a son besoin ).

    et pour une variable la seul maniere de differencier une definition d'une declaration est d'utiliser extern

Discussions similaires

  1. Problème sur Variable globale
    Par diamonds dans le forum Langage
    Réponses: 1
    Dernier message: 16/03/2007, 11h52
  2. Réponses: 4
    Dernier message: 04/02/2007, 20h39
  3. Réponses: 2
    Dernier message: 25/12/2006, 20h08
  4. Problème de variable globale
    Par Oberown dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/08/2006, 12h57
  5. Problème de variable globale
    Par Tournevyks dans le forum Général Python
    Réponses: 6
    Dernier message: 29/06/2006, 12h16

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