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 :

Utiliser une variable globale dans plusieures Form


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Japon

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Utiliser une variable globale dans plusieures Form
    Bonjour,

    Je rencontre actuellement un problème avec le programme que je tente de créer et je ne sais pas si je m'y prends de la bonne façon.

    Je dois utiliser des tableaux d'Ansistring à partir de plusieurs Form sous c++ builder.

    Dans la Form1, je déclare mon tableau en variable globale et je n'ai aucun souci pour l'utiliser.

    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
    #include <vcl.h>
    #include <string>
    #include <fstream>
    #include <iostream>
     
    using namespace std;
     
    const int MaxInterface = 200;
    const int MaxLangage = 20;
    const int MaxUser = 10;
    const int MaxTask = 50;
    const int MaxTemplate = 200;
    const int MaxCountry = 200;
    const int MaxScenario = 200;
    const int MaxMarket = 10;
    const int MaxSysInput = 100;
    const int MaxAdd = 50;
    const int MaxAddCase = 20;
    const int MaxCase = 20;
     
    AnsiString Interface[MaxInterface][MaxLangage];
    En revanche, je ne sais pas trop comment procéder pour l'utiliser à partir d'une autre Form.
    Si cest possible, j'aimerais aussi utiliser les mêmes constantes tant qu'à faire, plutôt que de les déclarer à nouveau dans chaque nouvelle Form que j'utilise.

    Si quelqu'un pouvait me mettre sur la voie, je vous remercie par avance.

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour et bienvenu,

    j'ai pour toi deux solutions, la première est à préférer. D'autres alternatives viendront peut être par la suite.

    1/ Donner une référence vers ce tableau aux constructeurs de tes objets. Cela à plusieurs avantages :
    • Tous tes objets auront accès à ces données (l'objectif) ;
    • à l'avenir, si tu souhaitais que deux objets référencent deux variables différentes, le code est pavé dans ce sens ;
    • tu peux te débarrasser de ta variable globale et l'englober dans un manager de Form ;
    • ça te facilitera la vie si tu veux tester ta classe.


    2/ Déclarer dans un globals.h extern AnsiString Interface[MaxInterface][MaxLangage]; et déclarer dans globals.c AnsiString Interface[MaxInterface][MaxLangage];.
    Pour utiliser la variable globale, il suffira d'inclure globals.h.
    Préférer la solution 1 .
    -- Yankel Scialom

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Et, surtout, ne décalre pas tes tableaux (surtout s'ils sont à deux dimension) sous la forme de tableau "C style"!!! utilise en priorité les collections fournies par la STL

    Bon, j'espère pour toi que la version de borland que tu utilises est un minimum "récente" (et que tu ne te trimbale pas encore un BCB5 ou BCB6, autrement... passe rapidement à une version plus récente ), mais, en gros, un tableau 2D n'est jamais qu'un tableau 1 dimention qui contient ligne * colonnes éléments.

    Tu peux donc envisager de "linéariser" ton tableau sous une forme qui serait proche de
    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
    class StringVector2D{
    public;
        const int MaxInterface = 200;
        const int MaxLangage = 20;
        StringVector2D():tab_(MaxInterface * MaxLanguage){}
        AnsiString const & operator()(int line, int column) const{
            assert(column < maxLanguage);
            assert(line < MaxInterface);
            return tab_[line * MaxLanguage + column];
        }
        AnsiString & operator()(int line, int column) {
            assert(column < maxLanguage);
            assert(line < MaxInterface);
            return tab_[line * MaxLanguage + column];
        }
    private:
        std::vector<AnsiString> tab_;
    };
    De cette manière, tu transmet une référence (de préférence constante) à toutes les fonctions qui ont réellement besoin de disposer de tes 4000 chaines de caractères, et tu récupère celle qui t'intéresse sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void foo(StringVector2D const & tab){
        int interface = 10 ; // c'est juste pour savoir de quoi on parle ici ;)
        int langage = 5 ;   // idem
        AnsiString const & recup = tab(interface, langage);
    }
    au pire, si tu dois pouvoir modifier la chaine de caractères, tu transmet cette classe sous la forme d'une référence non constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void foo(StringVector2D & tab){
        int interface = 10 ; // c'est juste pour savoir de quoi on parle ici ;)
        int langage = 5 ;   // idem
        tab(interface, langage)="Nouveau texte pour la chaine de caractères";
    }
    Mais, ceci dit, je me demande bien pourquoi tu veux travailler de la sorte...

    Si j'en crois les noms de tes variables, tu voudrais utiliser ton tableau 2D pour définir, dans différents langages, le texte affiché par les différents composants de chacune de tes interfaces. C'est, à mon sens, une très mauvaise idée que de vouloir centraliser toutes ces chaines de caractères à un seul endroit, ne serait-ce que parce que cela te posera forcément des problèmes le jour où tu envisageras de rajouter un langage ou une interface à ton application
    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

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/01/2015, 16h22
  2. Utilisation de variables globales dans une requete
    Par FFW_Rude dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 18/01/2011, 12h06
  3. Réponses: 3
    Dernier message: 20/11/2009, 19h51
  4. Réponses: 15
    Dernier message: 27/03/2009, 13h37
  5. Réponses: 3
    Dernier message: 31/12/2008, 12h50

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