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 :

lecture d'une variable déclarée dans un autre .cpp


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut lecture d'une variable déclarée dans un autre .cpp
    Bonjour tous,
    désolé pour ce titre pas très clair .
    je vais détailler mon problème assez précisement car j'ai l'impression d'avoir fait une bêtise quelque part:

    Attention: je suis débutant donc ne vous affolez pas si mon erreur est très bête

    1°) Voici mes .cpp et leurs objectifs:

    main.cpp: lance une fonction contenu dans LLL.cpp
    LLL.cpp:
    - on déclare un vector VVV qui va contenir des objets de type OOO
    - ensuite on lit un fichier texte et on classe des valeurs dans OOO

    OOO.cpp: permet de definir le type d'objet et de faire une methode: get_VALEURE
    calcul.cpp: fait des calculs à partir de la valeur contenu dans 000

    2°) mon problème:

    mon problème est dans calcul.cpp, je n'arrive pas à lire la valeur que j'ai inséré dans mon objet, voila ce que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur=VVV[0].get_VALEURE();
    et voila le message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VVV was not declared in this scope
    3°) tentative de resolution:

    ==> je me suis dit qu'il fallait mettre dans calcul.cpp la commande:
    car c'est dans LLL.cpp que le vector VVV a été déclaré

    mais ca ne fonctionne toujours pas

    ==> j'ai donc fait un test en inserant la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur=VVV[0].get_VALEURE();
    dans mon fichier LLL.cpp

    et là ca fonctionne

    4°) mon problème:

    Je ne veux pas avoir acces à la valeure dans LLL.cpp mais dans calcul.cpp
    mais comment dois je faire ?

    j'espere que vous pourrez m'aider...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pour commencer VVV est-elle une variable globale ou est-elle déclaré dans une de tes fonction ? Si c'est une variable globale il faut la definir quelque part(dans un .cpp) et utiliser le mot-clé extern pour la decarer dans tes autre fichier sources et la rendre accessible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // fichier1.cpp, chez toi LLL.cpp
    // definition
    int maGlobale = 0;
     
    // fichier2, chez toi calcul.cpp
    // declaration
    extern int maGlabole;
    Si elle est déclarée dans une fonction et que tu veux la passer à une autre fonction... les argument sont là pour :
    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
     
    //fichier1.cpp, chez toi LLL.cpp
    #include "fichier2.hpp"
    void fonctionAppelant()
    {
         int maVariable = 42;
         fonctionAppelee(maVariable);
    }
     
    // fichier2.hpp, declaration de fonctionAppelee, chez toi calcul.hpp
    void fonctionAppellee(int arg); 
     
    // fichier2.cpp, definition de fonctionAppelee, chez toi calcul.cpp
    #include "fichier2.hpp"
    void fonctionAppellee(int arg)
    {
       int valeurDeLArgument = arg;
    }
    Je te déconseille quand meme fortement l'utisation d'une variable globale, mais bon sans une minimum de code(déclaration de ta fonction,...) je ne pense pas pouvoir t'aider plus

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    non je n'ai pas déclaré comme une variable globale c'est peut etre pour cela que ca ne fonctionne pas...

    peux tu me dire quels sont les problemes liés au variables globales ?


    (pour le code je peux le mettre en ligne mais il faut que j'effectue des retouches car je ne peux pas tout montrer)

    je vais regarder tout cela de plus pret

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    j'ai essayer de declarer en tant que variable globale mais voici le message d'erreur qui est apparu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "no match for operator [] in VVVList[0]"
    je crois que le plus simple est de présenter mon code et ce que je veux faire, voici mon code:

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <iostream>  
    #include "Lecture.h"
    #include "Calcul.h"
    using namespace std;
    int main()
    {
        Lecture();
        Calcul();
    }
    lecture.h
    lecture.cpp
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include <iostream>      
    #include <fstream>        
    #include <sstream>       
    #include <vector>        
    #include "AAA.h"
    #include "BBB.h"
    using namespace std;
    vector <AAA> AAAList;    
    vector <BBB> BBBList;
     
    void Lecture()
    {
        string mon_fichier = "data.txt";
        ifstream dataBase(mon_fichier.c_str(), ios::in);    
        if(dataBase)                                          
        {
            while (!dataBase.eof())                            
            {
                  if (!dataBase.eof())
                  {
                      string command, dump, sub, trash;
                      int i=0;                                  //initailize 2 string
                      dataBase >> command;                      //we read the first word, with >> we scroll in the file word by word
                      if (command=="#")
                     {
                          getline(dataBase,dump);               //put the line in the variable dump
                          cout << dump << endl;
                          istringstream iss(dump);              //to cut the in words
                          while (iss)
                          {
                                iss >> sub;                     //to enumerate the nomber of word
                                i=i+1;
                           }
     
                      }
                      else if (command=="aaa")
                      {
                          string AAAName;
                          double x, y, z;
                          dataBase >> AAAName;     
                          dataBase >> x;
                          dataBase >> y;
                          dataBase >> z;
     
                          AAAList.push_back( AAA (AAAName,x,y,z) ); 
     
                       }
                       else if (command=="BBB")
                       {
                          string BBBName;
                          double X,Y,Z;
                          dataBase >> X;
                          dataBase >> Y;
                          dataBase >> Z;
     
                          BBB.push_back( BBB (BBBName,X,Y,Z) );
     
                       }
                    }
                    else
                    {
                        break;           //stop the loop if we are at the end of the file
                    }
                }
            }
            else
            {
                 cout << "Impossible d'ouvrir le fichier !" << endl;
            }
            dataBase.close();                                       // close dataBase file
    }
    AAA.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
    class AAA
    {
            public:
                    AAA(std::string,double,double, double);
                    ~AAA();
                    std::string get_AAAName() const;
                    double get_x() const;
                    double get_y() const;
                    double get_z() const;
     
            private:
                    std::string AAAName;
                    double x;
                    double y;
                    double z;
    };
    AAA.cpp
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include <iostream>
    #include <fstream>
    #include "Matrix.h"
    using namespace std;
    AAA::AAA(string _AAAName, double _x, double _y, double _z)
    {
            AAAName=_AAAName;
            x=_x;
            y=_y;
            z=_z;
    }
     
    AAA::~AAA()
    {
     
    }
     
    string AAA::get_AAAName() const
    {
        return AAAName;
    }
     
    double AAA::get_x() const
    {
         return x;
    }
     
    double AAA::get_y() const
    {
        return y;
    }
     
    double AAA::get_z() const
    {
        return z;
    }
    calcul.h
    void Calcul();
    calcul.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>  
    #include <vector>          
    #include "AAA.h"
    #include "BBB.h"
     
    using namespace std;
    double variable=0;
    void Calcul()
    {
     
        variable=AAAList[0].get_x();
     
    }

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Donc AAAList est une variable globale.

    Pour qu'elle soit accessible dans un autre fichier, comme l'a dit Joe, il faut dans ton lecture.h ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern std::vector <AAA> AAAList;
    (et déplacer les #include de AAA pour qu'ils soient dispos dans lecture.h)

    Après, une variable globale, son plus gros problème, c'est que comme elle peut être modifiée de n'importe où, on se retrouve à ne plus savoir pourquoi elle a une certaine valeur à un moment donné.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci d'avoir pris le temps de repondre

    Citation Envoyé par JolyLoic Voir le message
    Donc AAAList est une variable globale.
    Pour qu'elle soit accessible dans un autre fichier, comme l'a dit Joe, il faut dans ton lecture.h ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern std::vector <AAA> AAAList;
    (et déplacer les #include de AAA pour qu'ils soient dispos dans lecture.h)

    Après, une variable globale, son plus gros problème, c'est que comme elle peut être modifiée de n'importe où, on se retrouve à ne plus savoir pourquoi elle a une certaine valeur à un moment donné.
    (je crois que nos messages se sont croisés)
    je vais essayer ce que vous me dites avec une variable globale

    en attendant j'ai mis une partie de mes sources (ce qui m'interesse est dans le calcul.cpp et dans les else if du lecture.cpp)

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    je ne pense pas avoir très bien compris, voila ce que j'ai fait:

    1°) j'ai laissé mon code tel que on rajoutant juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern std::vector <AAA> AAAList;
    dans lecture.h

    2°) lorsque je compile j'ai une erreur dans le lecture.h
    j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AAA not declared in this scope


    edit: désolé dans le code ci dessus j'ai fait une erreur dans les non de fichiers c'est peut etre pour cela le probleme

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est ce que je disais : Pour que ça marche, déplace #include <AAA.h> de lecture.cpp vers lecture.h
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    C'est ce que je disais : Pour que ça marche, déplace #include <AAA.h> de lecture.cpp vers lecture.h
    Ok, désolé je m'étais mélangé les pinceaux


    J'ai fais les modifs nécessaires dans le lecture.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef INPUT_H_INCLUDED 
    #define INPUT_H_INCLUDED
    #include "AAA.h"
    extern std::vector <AAA> AAAList;
    void Lecture();
    #endif
    mais voici à présent l'erreur que j'ai pour la ligne extern....:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expected initializer before '<' token
    je ne comprends pas le probleme....

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    j'ai compris mon erreur:

    erreur tres bete

    ==> j'ai oublié d'insérer dans le .h la commande


    merci beaucoup loic et joe pour votre aide!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/03/2012, 09h44
  2. Réponses: 9
    Dernier message: 19/03/2010, 08h15
  3. [PHP 5.0] appel d'une variable global dans un autre fichier à partir d'une classe
    Par andry.aime dans le forum Langage
    Réponses: 1
    Dernier message: 13/01/2009, 09h31
  4. accéder à une variable déclarée dans un autre fichier
    Par sg.forums dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 31/10/2006, 09h20
  5. Utilisation d'une Variable(Vb) dans d'autre language
    Par cach dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/02/2005, 12h00

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