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

Discussion :

Stockage de données en mémoire

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Par défaut Stockage de données en mémoire
    Bonjour,

    Je souhaite créer une application qui enregistre des noms de joueurs avec différentes informations.
    Pour le stockage sur disque dur, je vais utiliser un fichier XML.

    Lorsque j'ouvre l'application, je charge le fichier. Lorsque je la ferme, je l'enregistre.
    Mais ce qui me pose problème c'est le stockage durant l’exécution de l'application.

    Dans cette application, il y aura une fenêtre de saisie pour enregistrer le nom d'un joueur plus d'autres infos. A chaque fois que l'utilisateur clique sur VALIDER, je veux mettre en mémoire ces infos. Est-ce une bonne solution d'écrire à chaque fois au fur et à mesure dans le fichier XML ?
    D'autant plus que l'application aura d'autres fonctionnalités comme : recherche un joueur dans la liste, rechercher une info sur lui, modifier, ...
    Ne serait-ce pas mieux de le mettre en mémoire pendant ce temps ?
    Je pensais à des variables globales en utilisant soit des struct, tableau ou table de hachage en fonction de ce que j'aurais à stocker. Mais j'ai vu que ces variables globales étaient déconseillées.
    Si j'utilise du local, il faudrait qu'elles soient dans la fonction main pour rester toujours actives et pas détruites à la fin de la fonction ?

    Je ne sais pas si j'ai été suffisamment clair mais je suis dans la réflexion de la conception et je veux essayer de poser sur le papier toutes les contraintes et solutions avant de commencer à coder.
    Merci de votre aide

    Fabien

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Je suis d'accord avec ton analyse.
    Si tu as besoin d'utiliser tes données et qu'elles peuvent tenir dans la mémoire, il est préférable de n'enregistrer qu'à la fin. Attention à ne pas louper des cette étape, il serait dommage de quitter l'application en oubliant celle-ci.
    Pour un système embarqué, ou si la durée de l'application est longue. On peut envisager des sauvegardes de sécurités régulièrement.

    Où mettre ces informations? Les globales sont 'interdites' car elle complexifient la lisibilité du code. Mais ici les données subsistent bien pendant toute la durée de l'application donc il y a bien quelque chose de 'global'. Mettre dans main() ou en global c'est en fait la quasiment la même chose, seule la visibilité et le lieu d'allocation différent. On peut aussi les encapsuler dans des static d'un objet, et cela est encore une globale. Ou bien les mettre dans des champs non static d'un objet créé dans main(). Les deux derniers me semblent les plus 'propres'.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Par défaut
    Merci dalfab pour ta réponse rapide et je suis rassuré d'être sur la bonne voie de réflexion.

    Pour l'enregistrement des données j'avais prévu de créer un fichier xml temporaire dans lequel l'application met les données à jour automatiquement toutes les x minutes.
    Je prévoyais également une variable bool qui mémorisait s'il y avait eu des changements et qui serait appelée au moment de quitter l'appli pour proposer alors une sauvegarde. Mais il aurait fallu qu'elle soit elle aussi globale.

    Donc si je comprend bien ta solution préconisée pour éviter les 'vraies' globales c'est :
    - créer une classe, qui se nomme par exemple mémoire
    - je l'instancie dans le main
    - a l'intérieur de cette classe se trouve des variables ou des champs public dans lesquels j'enregistre mes données.
    - Dans cette classe je définis des fonctions qui feront et vérifieront l'enregistrement régulier des données dans un fichier xml.

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    C'est effectivement la manière la plus propre de gérer ces cas de variables qui doivent être globales. Ensuite, tu passes cet objet en argument à toutes les parties de ton programme qui en ont besoin. (Si tu veux aller un cran plus loin, regarde du côté de l'injection de dépendances, avec injeQt par exemple pour Qt.)
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour.

    De mon point de vue, le mieux, ce serait de créer une classe InfosJoueurs avec un constructeur qui lirait le fichier XML. Si la lecture échouait (ex : fichier au mauvais format), une exception serait lancée avec le détail de l'erreur. Dans ton programme, cette classe serait instanciée sous la forme d'une variable automatique dans la fonction main (ou dans une fonction appelée par main). Le seul inconvénient serait qu'il faudrait ajouter un paramètre de type InfosJoueurs& ou const InfosJoueurs& dans beaucoup de fonctions.

    Créer un objet global de type InfosJoueurs dont la construction chargerait le fichier XML serait une mauvaise idée, car cela t'obligerait à traiter les erreurs dans ce constructeur (typiquement écrire dans un fichier de log et afficher un message), ce qui serait peu flexible. En fait, avant l'appel de main, les objets globaux sont construits mais, si la construction d'un objet global laisse échapper une exception, le programme s'arrête.

    Une autre possibilité serait de créer un objet global de type InfosJoueurs dont la construction ne ferait rien (donc ne risquerait pas d'échouer) et d'appeler dans main une fonction InfosJoueurs::chargerXml. L'inconvénient, c'est que tu n'aurais plus la garantie « l'objet est construit <=> le fichier a bien été chargé » et que, quand ton programme évolueras, il y aura une étourderie potentielle : essayer de lire les infos sur les joueurs alors que le fichier XML n'a pas encore été chargé.

    La classe InfosJoueurs aurait aussi une fonction InfosJoueurs::sauvegarderDansXml. Cependant, le fait que cette fonction soit appelée périodiquement ne serait pas directement géré par InfosJoueurs. Il vaut mieux découper les responsabilités.

  6. #6
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Par défaut
    Je pense à tout autre chose mais pourquoi ne pas utiliser SQlite avec Qt
    C est très rapide et spécialisé dans la gestion de données et de requêtes
    A mon avis ca simplifierait beaucoup les choses notamment pour les sauvegardes, une requête SQL et c est réglé
    Je suis peut être hors sujet mais je pense que c est une bonne solution

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 32
    Par défaut
    Merci pour toutes vos réponses que j'ai étudiée.

    Effectivement j'avais réfléchi à utiliser une base de données (ce que je connaissais lorsque je faisais du php) mais mon but est de construire un petit logiciel qui sera installé sur d'autres ordinateurs et utilisé par d'autres personnes que moi et je voudrais donc éviter l'installation de logiciels supplémentaires.

    J'ai commencé à faire des teste et j'en suis là :
    joueurs.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
    24
    25
    26
    27
    28
    29
    30
     
    class Joueurs
    {
    private :
     
     
    public:
        struct infosJoueur{
        QString m_nom;
        QString m_prenom;
        int m_licence;
        QString m_categorie;
        enum m_sexe{m,f};
        QString m_naissance;
        QString m_single_level;
        QString m_double_level;
        QString m_mixte_level;
        double m_single_cpph;
        double m_double_cpph;
        double m_mixte_cpph;
        QString m_club;
        };
        bool enrJoueurXML(infosJoueur &infosJoueur);
        bool supprJoueurXML(int m_idJoueur);
        void test(infosJoueur &infosJoueur);
        Joueurs();
    public slots :
        void validJoueur();
     
    };
    joueurs.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 "joueurs.h"
    #include <QMessageBox>
     
    Joueurs::Joueurs()
    {
     
    }
    void Joueurs::test(infosJoueur &infosJoueur){
        QMessageBox::information(this,"info",infosJoueur.m_club);
     
     
    }
    et enfin main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main(int argc, char *argv[]){
    //je ne vous ai pas mis ici toutes les instructions de construction de la fenetre
     
    Joueurs::joueur;
    Joueur.infosJoueur.m_club="test";
     
    // je voudrais appeler la fonction joueurs::test ici 
    return a.exec
    }
    Mon problème se situe donc dans le main. Lorsque je construis la classe joueurs, le type struct infosjoueurs est également construit si j'ai bien compris ou pas.
    Lorsque je compile, j'obtiens cette erreur :
    erreur : invalid use of ‘struct Joueurs::infosJoueur’
    Joueur.infosJoueur.m_club="test";
    ^

    Je comprends pas bien comment je devrais initialiser ma structure car à priori je l'utilise mal.

    De plus au vu de ma fonction et de son utilisation, si j'ai bien lu les cours, je n'ai pas besoin d'avoir recours au pointeur pour ce cas de figure.

    Merci encore à vous de votre aide
    Fabien

Discussions similaires

  1. Stockage de données en mémoire
    Par david71 dans le forum Langage
    Réponses: 3
    Dernier message: 04/09/2007, 15h20
  2. Dilemme : stockage de données en mémoire
    Par The Dark Lewis dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/09/2005, 12h28
  3. Persistance des données en mémoire
    Par giviz dans le forum Architecture
    Réponses: 13
    Dernier message: 21/12/2004, 09h44
  4. Stockage de données cartographiques en BDD
    Par Mack.51 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/06/2004, 12h48
  5. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05

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