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 :

variables perdues à cause des include


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut variables perdues à cause des include
    Bonjour,

    Les variables se perdent dans une série d'include

    J'ai trois fichiers
    1. main.cpp qui contient du code et est lié à Form1
    2. add.cpp qui contient du code et est lié à Form2
    3. shared.cpp qui ne contient que du code (shared.h est vide)

    main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "main.h" // pour acceder à ses contrôles
    #include "shared.cpp" // pour acceder aux variables et fonctions partagées
    #include "add.h" // pour accéder aux contrôles de Form2
     
    u=10;
    ...du code...

    add.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include "shared.cpp" // pour acceder aux variables et fonctions partagées
    #include "add.h" // pour accéder à ses contrôles 
     
    ...du code...
    shared.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifndef __shared
    #define __shared
    int U;
    ...du code...
    #endif
    J'accède à U sans problèmes si shared.cpp n'est pas inclut dans add.cpp mais lorsque j'ajoute #include "shared.cpp" dans add.cpp et qu'il se trouve donc inclut dans les deux fichiers (main et add), je n'arrive plus à acceder à U.
    Pourquoi?
    C'est ingérable :-(

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Fie,

    On n'inclut pas un fichier .cpp contenant du code, les .h ou .hpp sont là pour ça.

    Ça ne se fait pas, car le fichier est compilé, donne donc une nouvelle série de variables...fonctions pour chaque fichier dans lequel il est inclu.

    Sinon, pourquoi le besoin des .h se serait-il fait sentir ?

  3. #3
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut
    Ok, ça marche mieux.
    Mais si dans Main.cpp, à l'interieur du code d'un contrôle (par exemple, un bouton), je met une référence à une variable définie dans le nouveau shared.h, le lieur ne la trouve pas.

    J'ai tenté de la déclarer en extern dans shared.h ou dans main.cpp mais ça ne change rien.

    Pq, m'sieur ?

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Il faudrait un exemple minimum compilable (ma boule de crystal est en panne pour l'instant)...

    Ceci dit, il est fort vraisemblable qu'un des formulaire soit le formulaire "principal" et que l'autre soit un formulaire "secondaire" (ou encore, que le deux formulaires soient des formulaires secondaires et que tu en aies un troisième, dont tu ne nous aurais pas parlé, qui serait le formulaire "principal")

    Il faut savoir que l'une des informations (normalement) transmise lors de la création d'un sous-formulaire (formulaire secondaire) est justement ... le formulaire parent (formulaire principal)...

    Dés lors, le formulaire parent (principal) devient un candidat idéal pour abriter une variable qui devrait être partagée par l'ensemble des formulaires "secondaires", et, tout ce que tu as à faire, c'est de t'assurer que le formulaire enfant (secondaire) dispose de ce qu'il lui faut pour... accéder à cette variable "partagée" (AKA couple de mutateur/accesseurs).

    Maintenant, il y a peut être un défaut de conception qui se cache derrière tout cela, mais, à défaut d'avoir plus d'informations, il est difficile de se faire une idée
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut les fichiers
    Ben voilà :
    Donc, 3 fichiers, de 2 Forms

    Main.cpp lié à Form1
    Add.cpp lié à Form2
    Shared.h lié à que dalle.

    Shared.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
    17
    18
    19
    20
    21
    22
    23
     
    #ifndef __Shared
    #define __Shared
     
    #include <vcl.h>
    #pragma hdrstop
     
     
    struct TPatient
    {
    	public :
    	AnsiString Nom;
    	AnsiString Prenom;
    	AnsiString N100;
    	bool Dead;
    	bool Hospit;
    };
    DynamicArray <TPatient> Patients;
     
    int Prout;
     
    #pragma package(smart_init)
    #endif
    Main.cpp
    La fonction FindPatient marche très bien
    La fonction BitBtn1Click ne peut pas trouver le DynamicArray Patients

    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
     
    #include <vcl.h>
    #pragma hdrstop
    #include "shared.h"
     
    #include "main.h"
    #include "add.h"
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
     
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
     
    int FindPatient(AnsiString S)
    {// ça marche sans problème
    	for (i=0;i<Patients.Length;i++)
    	{
    		if (Patients[i].Nom==S)
    		return i; // retourne l'index du patient
    	}
            Prout++; //fonctionne
    }
     
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
      	Form2->Caption="Ajouter un patient";
    	Form2->ShowModal();
     
    // ajoute la patient à la liste
    // ICI QUE CA FOIRE
    	int n;
    	n=Patients.Length;
    	Patients.Length++;
    	Patients[n].Nom=Form2->LabeledEdit1->Text;
    	Patients[n].Prenom=Form2->LabeledEdit2->Text;
    	Patients[n].N100=Form2->LabeledEdit3->Text;
    	Patients[n].Hospit=Form2->CheckBox1->Checked;
    	Patients[n].Dead=Form2->CheckBox2->Checked;
            Prout++;// marche pas
    }
    le fichier add.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
     
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "add.h"
    #include "shared.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
    	: TForm(Owner)
    {
     
     
    }
    void __fastcall TForm2::BitBtn1Click(TObject *Sender)
    {
    	ModalResult=0;
     
    	//vérifie l'existence de ce patient
    	int i;
    	for (i=0;i<Patients.Length;i++)
    	{
    		if (Form2->LabeledEdit1->Text==Patients[i].Nom)
    			if (Form2->LabeledEdit2->Text==Patients[i].Prenom)
    			{
    				Application->MessageBoxA("Ce patient existe déjà","Erreur",0);
    				Form2->LabeledEdit1->SetFocus();
    				return;
    			}
    	}
    	ModalResult=1;
     
     
    }

    Voilà. Je ne comprends pas comment, dans le même fichier, le DynamicArray n'est pas accessible partout !
    Je me dis que ça doit être lié à la séquence de création des contrôles ou quelque chose du genre mais je ne me l'explique pas.
    Ce n'est pas lié au statut du DynamicArray (dont je sais qu'il a mauvaise presse par rapport au vector mais que je trouve plus simple) parce que l'int Prout rencontre le même problème.

    C'est grave docteur?

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Wio,

    Relis les docs basiques sur l'utilisation de la compilation séparée avec des .h...

    un .h ne doit pas déclarer de variables, il doit seulement signaler au compilateur qu'elles existent ailleurs.

    share.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    extern DynamicArray <TPatient> Patients;
     
    extern int Prout;
    ...
    ET le share.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    DynamicArray <TPatient> Patients;
     
    int Prout;
    ...

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

Discussions similaires

  1. Variables d'une page php contenant des include
    Par MelkInarian dans le forum Langage
    Réponses: 7
    Dernier message: 24/10/2011, 10h23
  2. Passer des variables dans un fichier include
    Par kenny.kev dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2008, 23h31
  3. #include bidirectionnel cause des problèmes
    Par matrox dans le forum C++
    Réponses: 4
    Dernier message: 21/06/2006, 16h46
  4. [JSP] utilisation dynamique des includes
    Par shinchun dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/05/2004, 15h28
  5. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 10h49

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