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 :

DLL et initialisation des variables globales.


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Points : 59
    Points
    59
    Par défaut DLL et initialisation des variables globales.
    Salut,

    Je bosse sur un moteur de jeu, et j'ai des soucis avec les variable globales dans une DLL.

    J'ai structure mon jeux comme suit :

    Une premiere DLL Engine qui contient le moteur du jeu, tout les mechanismes.

    Une deuxieme DLL Objects, qui contient tout les objets specifiques au jeu, principalement des objets qui herite d'une classe GameObject et redefinissent juste des comportement.

    Une troisieme DLL Editor, qui contient l'essentiel pour faire fonctionner l'editeur de jeu.

    Engine sera utilise par le client du jeu.
    Editor sera utilise par l'editeur de jeu.
    Objects est utilise par les deux.

    Afin de pouvoir instancier mes GameObject facilement, j'ai fais une classe GameObjectFactory.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class EX_API GameObjectFactory
    {
    public:
    	GameObjectFactory();
    	~GameObjectFactory();
     
    	GameObject * Register(const std::string & name, GameObject * obj);
     
    	GameObject * Create(const std::string & name);
     
    private:
    	boost::unordered_map<std::string, GameObject *> m_prototypes;
    };
    La factory permet d'instancier mes GameObject a partir de leur nom de classe.

    Donc si je register un BasicEnemy par exemple, j'y accederais avec la string "BasicEnemy"

    Mon soucis vient pour la registration des objets.

    J'ai definis une macro que j'appel dans le .cpp de chaque specialisation de GameObject :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define REGISTER_GAMEOBJECT(className) static const GameObject * s_##className##decl = GameObjectFactory::Instance().Register(#className, new className());
    Je me retrouve donc dans le .cpp avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    REGISTER_GAMEOBJECT(BasicEnemy)
     
    // Ce qui revient a ecrire
    // static const GameObject * s_BasicEnemydecl = GameObjectFactory::Instance().Register("BasicEnemy", new BasicEnemy());
     
    BasicEnemy::BasicEnemy() :
    m_life(1)
    {
    }
     
    ...
    Mon probleme est que, 1 fois sur 2, cette variable s_classNamedecl n'est pas initialisee. Tantot elle est bien appelee avant d'entrer dans le main, tantot elle ne l'est pas du tout.

    Et je ne comprend absoluement pas pourquoi!

    Quelqu'un pourrait-il m'expliquer les raisons du pourquoi et du comment?

    J'utilise Visual Studio 2008 pour mon projet.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Hum... je ne suis pas un spécialiste de Visual mais singleton et DLL font rarement bon ménage sous Visual. Je t'encourage à chercher de ce côté; ça fait couler beaucoup d'encre sur les forums.

    As-tu essayé de faire une librairie statique pour Objects et de linker Engine et Editor contre ? Ça pourrait mieux marcher.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Points : 59
    Points
    59
    Par défaut
    J'ai deja vu les histoire de Singleton et de DLL, j'ai fais les modifications qui vont bien, mais ce n'est pas lie a ce probleme.

    Je cherche justement a eviter la lib static pour avoir juste a recompiler la DLL des objets pour que le jeu et l'editeur soit mis a jour sans recompiler l'executable.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    As-tu essayé de passer en statique pour voir si ça changeait quelque chose ?

    Autrement, il faudra que tu postes un code complet révélateur du problème.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2006
    Messages : 122
    Points : 59
    Points
    59
    Par défaut
    J'ai trouve une solution simple en fait.

    Pour que la dll initialise ses variables, il me suffit d'instancier un des objets de cette DLL, meme une seule fois en debut de programme.

  6. #6
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define REGISTER_GAMEOBJECT(className) EX_API const GameObject * s_##className##decl = GameObjectFactory::Instance().Register(#className, new className());
    le fait de faire un export va forcer la DLL a initialiser cet objet, qu'il soit utilise ou non.

Discussions similaires

  1. Dll avec des variables globales
    Par declencher dans le forum Débuter
    Réponses: 2
    Dernier message: 03/04/2008, 07h31
  2. Initialisation des variables globales dans un package
    Par fred_hte_savoie dans le forum SQL
    Réponses: 2
    Dernier message: 17/04/2007, 10h26
  3. portée des variables globales dans un fichier js
    Par crakazoid dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 14/04/2006, 16h49
  4. utilisation des variables global dans tout le projet
    Par EYENGA Joël dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/01/2006, 10h55
  5. De la bonne pratique des variables globales...
    Par say dans le forum C++Builder
    Réponses: 9
    Dernier message: 25/11/2005, 09h47

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