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 :

std::pair et void*


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Par défaut std::pair et void*
    Bonjour,

    voici mon petit soucis,

    je génère des données sous la forme de std::par<int, bool>
    jusque la pas de soucis

    ensuite je les stock dans un objet graphique sous la forme d'un void* (la je n ai pas le choix du type de donnée stockée)

    et enfin lorsque je recupère ces données elles sont forcément dans un void*
    et la est mon problème; je n'arrive pas a correctement accéder a la dite pair soujacente ;

    en gros:
    stockage std::pair<....> data <1, true>
    setData((void*)(&data))

    en recuperation rien ne va :/
    car le getData me renvoit un void* que je cast en std::pair<>*
    et ensuite je suis perdu pour accéder à mes param first et second;

    si quelqu'un a des idées, en espérant avoir été clair

    merci bien

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Déjà, si tu n'as pas d'autre choix que de transformer ta paire en void*, c'est vraiment pas bien...

    Si la structure sur laquelle tu appelles setData est une structure de ton cru, il serait des plus intéressant de commencer par la corriger, de sorte à éviter le void* à tout prix (templatiser ta structure, peut etre )

    Si cette structure est fournie par une bibliothèque... je te conseillerais volontiers de voir à en changer, car l'utilisation d'un void* comme paramètre est souvent utile en C mais pique vraiment les yeux en C++

    Ceci étant dit, je présume que setData et getData sont utilisés dans des fonctions totalement différentes

    Or, il faut se rappeler qu'une variable n'existe qu'entre le moment de sa déclaration ( en l'occurence std::pair<int, bool> data(1, true) ) et le moment où l'on sort de la portée dans laquelle elle est déclarée ( l'accolade fermante "}" correspondant au niveau dans lequel la variable est déclarée ).

    Dans un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void MyStruct::createPair(int key, bool value)
    {
        std::pair<int, bool> toadd=std::make_pair(key, value);
        setData((void*) & toadd);
    } // !!!!  toadd est détruit ici
    nous avons donc le problème que l'adresse que l'on a transformée ne pointeur sur void pointe sur... plus rien du tout une fois que l'on est sorti de la fonction

    Il n'est donc pas étonnant, si tu as une autre fonction proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void MyStruct::process() const
    {
         std::pair<int, bool> * ptr=(std::pair<int,bool)* getData();
        /* faire quelque chose ici */
    }
    que ptr soit "dans les choux", vu que l'adresse obtenue pointe sur quelque chose qui a déjà été détruit

    La solution la meilleure est, comme je te l'ai dit plus haut, de faire en sorte que la structure gère un ensemble de std::pair<int, bool> et non un ensemble de pointeurs sur void !!!

    Mais, si tu n'as vraiment pas le choix, il faudra alors veiller à prendre en main la responsabilité de la durée de vie de tes paires...

    Cela doit donc passer par l'utilisation de new, et il faudra veiller à ce que la structure fasse correctement le ménage (en appelant delete sur les void* qui correspondent au pointeur sur paire ) ...

    Ta fonction d'ajout devrait donc ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MyStruct::createPair(int key, bool value)
    {
        std::pair<int, bool> *toadd=new std::pair<int, bool>(key, value);
        setData((void*)  toadd);
    } // plus de problème : on a pris la main sur la durée de vie de ce qui est
      // pointé par toadd


    Mais attention, je présume que, si tu dois fournir un void* à setData, c'est sans doute parce que tu risque d'utiliser autre chose que des paires int, bool...

    Lors de la destruction de la structure au départ de laquelle tu invoques setData, tu risque d'avoir quelques soucis pour déterminer quel était le type de la donnée à la base

    NOTA : j'ai utilisé ici la meme syntaxe que celle que tu utilisais, mais il faut savoir que l'idéal est d'utiliser reinterpret_cast en lieu et place du transtypage " C style"
    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

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Par défaut
    re,

    merci pour cette réponse rapide

    effectivement je n'est pas le choix pour le void* car cette donnée est liée à un objet graphique (une combobox) dans laquelle on peut ajouter des données pour chaque item;
    du coup je n ai pas de problème de persistance des données;

    la ou est mon soucis c'est quand je recupère ces données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::pair<> *data;
    data = (std::pair<>*)combo->getItemData(id);
    (*data).first; // ici je suis dans les choux
    bon vous allez vous dire, quel truffe lui ... mais c est presque les vacances et le pitit pois qui me sert de cerveau me semble déjà parti en vacances

    merci bien tout de même

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par ta9ada Voir le message
    re,

    merci pour cette réponse rapide

    effectivement je n'est pas le choix pour le void* car cette donnée est liée à un objet graphique (une combobox) dans laquelle on peut ajouter des données pour chaque item;
    Si, tu as des problèmes de persistance de données...

    Non pas au niveau de la combobox (quoi que j'ai un très gros doute quant à la manière dont les void* seront effectivement détruits par le combobox), mais bien au niveau de la fonction qui appelle setData...

    si tu n'alloues pas dynamiquement la mémoire pour ta paire, l'adresse que tu fournis à setData pointera sur un objet qui a déjà été détruit, et dont l'adresse aura surement été réutilisée par la suite
    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

  5. #5
    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
    Par défaut
    Citation Envoyé par ta9ada Voir le message
    en gros:
    stockage std::pair<....> data <1, true>
    setData((void*)(&data))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::pair<....> data  = new std::pair<....> (1, true);
    setData((void*)(data))
    Mais j'espère que c'est pas pour un projet pro. Car bonne chance pour garantir l'absence de fuite mémoire entre autre.

Discussions similaires

  1. Foncteur d'additionnement de std::pair
    Par Fr3ak dans le forum C++
    Réponses: 2
    Dernier message: 24/09/2011, 21h17
  2. std::pair et reference
    Par camboui dans le forum SL & STL
    Réponses: 17
    Dernier message: 30/03/2009, 19h54
  3. Défénir un std::map à partir d'un std::pair
    Par mat087 dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/12/2006, 19h36
  4. tri sur std::vector<std::pair<int, float> >
    Par b4u dans le forum SL & STL
    Réponses: 15
    Dernier message: 01/10/2006, 09h19
  5. Equivalent de std::pair mais pour trois valeurs
    Par Rodrigue dans le forum SL & STL
    Réponses: 6
    Dernier message: 26/09/2006, 22h00

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