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

SL & STL C++ Discussion :

Obtenir l'adresse du contenu d'un std::vector<bool>


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut Obtenir l'adresse du contenu d'un std::vector<bool>
    Voici un exemple de code fonctionnel (mais peut-être pas très "propre")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<unsigned> vu;
    vu.push_back(25);
    unsigned *pu=&*vu.begin();
    file.write(pu,vu.size()*sizeof(unsigned));
    Le but est de récupérer le buffer de vector pour le sauver sur fichier. L'opération inverse en lecture fonctionne aussi.

    Ça ne fonctionne pas avec la spécialisation std::vector<bool>.
    Comment faire pour récupérer son buffer interne dans le but de le transférer dans un fichier binaire ?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    std::vector<bool> est une spécialisation de std::vector<> optimisée pour que chaque élément n'occupe qu'un bit. Mais en revanche, tu perds la 'continuité' : vect_bool[n] != &vect_bool[0] + n.
    Il y a peut être d'autres solutions, mais la première qui me vient est de sérialiser à la main chaque élément selon le format de ton choix.

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Je viens de trouver une solution sous VS2005, mais je doute que ce soit portable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector<bool> vb;
    vb.push_back(true);
    std::_Vbase *b=(*vb.begin())._Getptr();
    Sachant que _Vbase est un typedef sur unsigned.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par camboui Voir le message
    Je viens de trouver une solution sous VS2005, mais je doute que ce soit portable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector<bool> vb;
    vb.push_back(true);
    std::_Vbase *b=(*vb.begin())._Getptr();
    Sachant que _Vbase est un typedef sur unsigned.
    Effectivement, ce n'est pas probablement pas portable et tu risques d'avoir différents problème :
    -> Ne marche plus avec une nouvelle version de VS s'ils décident de changer l'implémentation
    -> Non portable
    -> Problèmes d'endian

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    std::vector<bool> est une spécialisation de std::vector<> optimisée pour que chaque élément n'occupe qu'un bit. Mais en revanche, tu perds la 'continuité' : vect_bool[n] != &vect_bool[0] + n.
    Il y a peut être d'autres solutions, mais la première qui me vient est de sérialiser à la main chaque élément selon le format de ton choix.
    contiguïté?

    Sinon pourquoi se taper du NIH (tu te retrouves confronté au même problèmatique) utilise ce qui existe. (boost.serialisation).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Goten Voir le message
    contiguïté?
    oui

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    J'ai pas tout suivi, mais std::bitset ne serait-il pas la solution?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par r0d Voir le message
    J'ai pas tout suivi, mais std::bitset ne serait-il pas la solution?
    Il me semble que le problème sera le même. Tu ne peux pas avoir un pointeur sur la zone mémoire contiguë () représentant les bit, non ?

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Effectivement tu as raison. Je croyais que oui, mais je viens de lire la doc, et en fait, du point de vue du stockage, bitset est identique que vector<unsigned>, seule l'interface change.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par r0d Voir le message
    vector<unsigned>
    vector<bool>. Ton clavier a fourché

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    ooops
    Pour me punir, je vais aller faire une heure de vb
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  12. #12
    screetch
    Invité(e)
    Par défaut
    non ne fait pas ca! fais du Perl a la place

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

Discussions similaires

  1. Obtenir l'adresse mac de sa carte reseau
    Par kivoch dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/11/2009, 18h30
  2. Debug VS8 contenu d'un std::vector
    Par glKabuto dans le forum Visual C++
    Réponses: 2
    Dernier message: 22/04/2008, 17h26
  3. obtenir l'adresse MAC
    Par acastor dans le forum Développement
    Réponses: 2
    Dernier message: 18/04/2004, 13h19
  4. Obtenir l'adresse IP de mon pc
    Par Biou Pink Powa dans le forum C
    Réponses: 3
    Dernier message: 28/01/2004, 20h01
  5. Obtenir l'adresse MAC réelle
    Par gpetto dans le forum Réseau
    Réponses: 16
    Dernier message: 03/11/2003, 16h56

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