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

Qt Discussion :

variable globale à un projet


Sujet :

Qt

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Par défaut variable globale à un projet
    bonjour,

    je fais un prog qui utilise une base sqlite. Le nom de cette base est déterminé (fichier ini) dès l'ouverture (splash dans main.cpp).

    Comment rendre cette variable (le nom du fichier contenant la base de données accessible depuis n'importe quel autre partie du code.
    ou pour le dire autrement, comment créer une variable globale ?

    Merci à vous

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Actuellement, ma technique est ( et aussi pour tout les nombres "magiques" ) de faire un fichier global.hpp et d'y mettre mes variables en passant par le préprocesseur ( certains dirant qu'il faut mieux faire un const .... )
    Comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define FILENAME "./data/filename.ini"
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Par défaut
    Merci à toi
    L'idée est bonne, mais sauf erreur de ma part, cela crée une constante que tu globalises.
    Or je souhaite une variable, qui sera initialisée dans le code et non en dur...

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Actuellement, ma technique est ( et aussi pour tout les nombres "magiques" ) de faire un fichier global.hpp et d'y mettre mes variables en passant par le préprocesseur ( certains dirant qu'il faut mieux faire un const .... )
    Comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define FILENAME "./data/filename.ini"
    En c++, autant utiliser une variable const :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         const std::string FILENAME = "./data/filename.ini";
    au moins c'est type safe.

    Pour telemarker05, pourquoi as tu besoin de faire
    le nom du fichier contenant la base de données accessible depuis n'importe quel autre partie du code.
    Sinon, c'est avec le pattern singleton qu'il faut faire cela. Mais attention, c'est un peu le pattern du diable

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Par défaut
    pour yan
    Dans mon main.cpp, je lance un splash, durant lequel je lis mon fichier de conf, je récupère le nom du fichier contenant ma base sqlite.

    J'en profite pour la créer si elle est manquante.

    Du coup je souhaite transmettre ce nom de fichier à ma mainwindow pour éviter d'avoir à relire le fichier de conf... et pour qu'elle puisse traiter la base de données.

    Merci de ton aide.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Donc ça devient du global non constant ... ou alors ... on peut aussi jouer sur d'autre détail. Mais je ne me vois pas faire un singleton pour ça.

    Pour revenir à ma suggestion ... le #define, bien géré peut ne poser aucun problème (type safe):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define MON_INT 12i;
    #define MON_FLOAT 1.2f;
    #define MA_CHAINE "fichier.txt"
    Je pense que c'est assez type safe, grâce aux indicateurs. De plus contrairement aux const, je ne prend pas de mémoire ( juste de la place dans l'executable ). ( Bon ça c'était l'argument nul ). Mais je pense que les deux sont corrects.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    [quote=LittleWhite;4775261]Pour revenir à ma suggestion ... le #define, bien géré peut ne poser aucun problème (type safe):[/code]
    oui et non
    http://www.comeaucomputing.com/techtalk/#definevsconst

    Je pense que c'est assez type safe, grâce aux indicateurs
    dans ton cas surement, mais pour une personne qui reprendrais ton code...

    Après, faut juste savoir le risque que cela comporte.

    Pour revenir au problème, pourquoi ne pas faire une fonction dans ton mainwindow qui prend en paramètre le nom du fichier?

  8. #8
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    J'ai tendance à condamner l'utilisation du Singleton dans ce genre de situations, idem pour les macros ou quoi. On est en OO, donc c'est plutôt soit ta fenêtre principale directement, soit un objet qui sera maintenu par ta fenêtre principale (ma solution de prédilection) qui a la responsabilité, mais pas un truc réparti entre 2343 fichiers, on ne sait où.

  9. #9
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Note qu'il charge dynamiquement sa donnée depuis un fichier de config donc de toutes façons un #define ne convient pas.

    Une solution courante est de mettre ce genre d'info dans ton objet Application (qui dérive de QApplication), qui est déjà un singleton. Tu peux aussi instancier à chaque fois que tu en as besoin un QSettings qui va lire à nouveau la valeur depuis ton fichier ini (je ne pense pas que ce soit pénalisant), ou conserver ton QSettings initial comme donnée membre de ton objet Application par exemple.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 14
    Par défaut
    merci à vous.

    Ma solution reste simple :
    dans le main.cpp je valide ma base durant l'affichage du splash.

    Dans ma mainWindow, je relis mon fichier ini pour trouver le nom du fichier qui contient la base, que je stocke dans un attribut privé de ma classe mainWindow.
    Il devient accessible, via un accesseur en lecture, à tout objet instancié dans ma mainWindow.

    Merci encore à vous tous

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

Discussions similaires

  1. liste des variables globales dans un projet
    Par Mokhtar BEN MESSAOUD dans le forum Eclipse C & C++
    Réponses: 1
    Dernier message: 29/05/2008, 14h25
  2. [VBA-E] Variables globales sur tout un projet
    Par a.dequidt dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 15/10/2007, 10h48
  3. Déclarer une variable globale au projet
    Par delphi+ dans le forum Delphi
    Réponses: 6
    Dernier message: 22/02/2007, 19h43
  4. Variable super globale au projet
    Par florent149 dans le forum Général VBA
    Réponses: 35
    Dernier message: 11/07/2006, 10h52
  5. 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

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