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 modifiée dans une fct et réinitialisée dans une autre fct


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut Variable globale modifiée dans une fct et réinitialisée dans une autre fct
    Bonjour,

    J'ai déclaré une variable globale "factsPhone" comme étant une liste de faits (classe Fact) dans un fichier header "initialization.h" et j'ai crée une fonction "initializeFactsPhone()" pour remplir "factsPhone" comme suit :

    "initialization.h" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        list<Fact> * factsPhone = new list<Fact> ();   //facts of phone
        void initializeFactsPhone(){
     
            Fact f1 (lp1, "justified", "collected");
            Fact f2 (lp2, "justified", "collected");
            Fact f3 (lp3, "justified", "collected");
            factsPhone->push_back(f1);
            factsPhone->push_back(f2);
            factsPhone->push_back(f3);
        }
    Dans un 2ème fichier Entity.cc, j'ai créé deux fonctions : la première sert à appeler la fonction "initializeFactsPhone()" pour initialiser la variable globale "factsPhone" et la 2ème fonction sert à gérer la liste "factsPhone comme suit :

    Entity.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
    18
    19
    #include "initialization.h"
    ...
    void Entity::initialize()
    {
       if (strcmp("phone", getName()) == 0)
        {
            ....
            initializeFactsPhone();
            ....
        }
     
    void Entity::handleMessage(cMessage *msg)
    {
        ev << "factsPhone : " << factsPhone->empty() << endl;  //afficher 1 : liste remplie; 0 : liste vide
        int i=0;
        while (!selectedRules->empty())
        {....
         }
    }
    Mon programme commence par exécuter la fonction Entity::initialize(), j'ai pu afficher le contenu de la liste "factsPhone" dans la même fonction Entity::initialize().
    Cependant, lorsque mon programme exécute la fonction Entity::handleMessage, la liste factsPhone est vide!!! le programme affiche "1" pour "factsPhone->empty()".

    Je soupçonne que c'est un problème de gestion de variable globale modifiée au sein de la fonction "Entity::initialize()" et réinitialisée dans l'autre fonction "Entity::handleMessage".

    J'ai modifié la déclaration de "factsPhone" en rajoutant une fois "static" et une fois "extern" mais ça ne marche toujours pas.

    Comment gérer une variable globale modifiée par toutes les fonctions et non réinitialisée pour chaque fonction ?

    Pourriez vous SVP m'aider?

    Je vous remercie d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Merci de mettre ton code dans la balise idoine.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    Je m'excuse mais je n'ai pas pu modifier mon message pour mettre le code dans la balise.
    Dorénavant je vais le faire, pourriez vous m'indiquer comment le faire?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    Je ne vois rien dans votre code qui permet d'affirmer que la méthode "initializeFactsPhone" soit obligatoirement appelée avant la méthode "handleMessage".

    Evitez les variables globales. Utilisez le Design Pattern Singleton au pire.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Je te suggère de transformer ta variable globale en une classe, que tu utilise une seule fois si tu veux.

    Par exemple, plutôt qu'avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main () {
        initialiser_truc();
        for(int i = 0; i<10; ++i) utiliser_truc(i);
        vider_truc();
    }
    il vaut mieux avoir ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main () {
        Truc truc();
        for(int i = 0; i<10; ++i) truc.utiliser(i);
    }
    Ainsi, il n'y a plus de variable globale (je peux avoir deux Truc), et je peux me reposer sur le destructeur de Truc pour garantir le vidage correct (c'est le RAII).

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Ou alors tu met factsPhone en static.
    En déboguant je te met ma main à coupé que ton factPhone dans initializeFactsPhone n'a pas la même adresse mémoire que celui qui est dans ton Entity.cc.

Discussions similaires

  1. Réponses: 10
    Dernier message: 23/12/2013, 11h23
  2. [2.x] Variable globale modifiable
    Par LEF97 dans le forum Symfony
    Réponses: 4
    Dernier message: 21/11/2013, 00h10
  3. [AC-2003] Tester si une cellule est vide dans un classeur excel et faire une boucle
    Par moilou2 dans le forum VBA Access
    Réponses: 11
    Dernier message: 19/08/2009, 09h34
  4. Réponses: 4
    Dernier message: 19/10/2006, 17h19

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