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

Langage C++ Discussion :

Stockage de structures de taille aléatoire (suite..)


Sujet :

Langage C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut Stockage de structures de taille aléatoire (suite..)
    Bonjour à tous,

    Cette discussion fait suite à la première du même nom que celle ci.

    Je suis en train d'essayer de stocker des données à l'aide de QDataSteam (je sais, c'est du Qt mais je pense que le problème est plus d'ordre C++)

    Alors voila, j'ai une structure qui contient un énumératif et j'aimerai l'écrire et le lire convenablement.

    En Écriture :
    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
     
    enum Test
    {
      value_1 = 0,
      value_2 = 2,
      value_3 = 42,
    };
     
    struct help
    {
      Test value;
    };
     
    QDataStream&  operator<<(QDataStream &ds, help const& me)
    {
      ds << me.value;
      return (ds)
    }
     
    int main(int ac, char **av)
    {
      help me;
      me.value = value_3;
      QApplication app(ac, av);
      QString fileName = QFileDialog::blaBla
      QFile file(fileName);
      file.open(...);
      QDataStream stockage(&file);
      stockage << me;
      return (app.exec());
    }
    Cela compile (bien sur en complétant ce que j'ai zappe car cela ne sert a rien )

    Maintenant la lecture :
    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
     
    enum Test
    {
      value_1 = 0,
      value_2 = 2,
      value_3 = 42,
    };
     
    struct help
    {
      Test value;
    };
     
    QDataStream&  operator>>(QDataStream &ds, help const& me)
    {
      ds >> me.value;
      return (ds);
    }
     
    int main(int ac, char **av)
    {
      help me;
      QApplication app(ac, av);
      QString fileName = QFileDialog::blaBla
      QFile file(fileName);
      file.open(...);
      QDataStream stockage(&file);
      stockage >> me;
      std::cout << me.value << std::endl;
      return (app.exec());
    }
    Cette partie ne compile pas.. Le seul moyen que j'ai trouvé est de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct help
    {
      Test value;
    };
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct help
    {
      int value;
    };
    Et la j'obtiens bien mon 42. Mais je veux pas changer le prototypage de ma structure!
    L'erreur de compilation est la suivante :
    erreur: no match for QDataStream& operator>> in ds >> me.help::value
    candidates are :
    ...
    note: QDataStream& operator>>(QDataStream&, help&)
    note: no known coversion for argument 2 from Test to help&

    En espérant avoir exposé le problème avec le plus de clarté possible et en donnant le plus d'indications possible aussi.

    Merci d'avance si vous avez une idée.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Peut-être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    QDataStream& operator>>(QDataStream &ds, help& me) // <-- suppression du const
    {
      return ds >> static_cast<int&>(me.value);
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Oui désolé pour le const j'ai fais un vulgaire copier collé (oui j'aime pas trop codé sur page web)

    Je test ça (je crois l'avoir déjà fais et cela ne fonctionnait pas ) et je tiens au courant !

    EDIT : erreur: invalid static_cast form type Test to type int&

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Bizarre.
    Et en modifiant le type sous-jacent de Test ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     //C++11-seulement et, en temps normal, facultatif pour int
    enum Test : int { ... };

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Désolé mais je ne vois pas ce que tu veux dire

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Ben réécrit ton enum en ajoutant simplement : int , comme au dessus.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Pareil qu'au départ..

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Peut-être en compilant avec -fpermissive ?

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Non plus

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Essaie comme ça, sinon je donne ma langue au chat...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iterator>
     
    QDataStream& operator>>(QDataStream &ds, help& me)
    {
      me.value = (Test)(*std::istream_iterator<int>(ds));
      //ou plus simplement
      int buf = 0;
      ds >> buf;
      me.value = (Test)buf;
     
      return ds;
    }

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Non..
    erreur: no matching function for call to std::istream_iterator<int>::istream_iterator(QDataStream&)

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    A tout hasard, tu n'aurais pas inclu un en-tête de "forward déclaration" au lieu de l'en-tête complet?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    J'ai donné exactement le code que j'ai dans mes fichiers. Sachez que ce sont deux programmes différents et qui sont dans deux répertoires différents. En espérant avoir répondu.

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    pour l'écriture, l'enum est casté en int, et l'opérateur << est surchargé pour un int.
    Pour la lecture, il n'y a pas de cast, puisqu'on écrit dans un enum.
    Ce qui n'existe pas, mais on a une surcharge vers int qui marche très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QDataStream&  operator>>(QDataStream &ds, help & me)
    {
      int v;
      ds >> v;
      me.value = static_cast<Test>(v);
      return (ds);
    }
    Si tu tiens absolument à utiliser directement l'enum, il doit être possible de surcharger pour lui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QDataStream&  operator>>(QDataStream &ds, Test& me)
    {
      int v;
      ds >> v;
      me = static_cast<Test>(v);
      return (ds);
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Essaie comme ça, sinon je donne ma langue au chat...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iterator>
     
    QDataStream& operator>>(QDataStream &ds, help& me)
    {
      int buf = 0;
      ds >> buf;
      me.value = (Test)buf;
     
      return ds;
    }
    Merci cob59, ce code fonctionne. Je trouve ca limite mais au moins cela me permet d'avancer. J'aimerai bien comprendre pourquoi cela ne fonctionne pas de base donc si quelqu'un a la solution ce sera juste pour ma curiosité (si ce n'est pas le cas, je passerai la discussion comme résolue)

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par DarKaa Voir le message
    Merci cob59, ce code fonctionne. Je trouve ca limite mais au moins cela me permet d'avancer. J'aimerai bien comprendre pourquoi cela ne fonctionne pas de base donc si quelqu'un a la solution ce sera juste pour ma curiosité (si ce n'est pas le cas, je passerai la discussion comme résolue)
    Si tu lisais ma dernière réponse.. ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Stockage de structures de taille aléatoire
    Par DarKaa dans le forum Langage
    Réponses: 11
    Dernier message: 04/04/2013, 17h19
  2. Images de taille aléatoire
    Par sam01 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 03/10/2009, 22h02
  3. Réponses: 9
    Dernier message: 21/05/2008, 14h56
  4. Réponses: 0
    Dernier message: 28/09/2007, 13h55
  5. Réponses: 7
    Dernier message: 08/12/2005, 09h26

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