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

C++ Discussion :

Recup�rer valeur point� par void *


Sujet :

C++

  1. #1
    Membre � l'essai
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2013
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Par d�faut Recup�rer valeur point� par void *
    Bonjour,

    J'ai une fonction qui me retourne un void * dans un de mes programmes. Mon probl�me est que je voudrais r�cup�rer la valeur point� par ce void*. La seule mani�re que j'ai trouv� et de caster ce pointeur sur le type de donn�es sur lequel il pointe. Par exemple je sais que mon void * pointe sur un unsigned long. Donc je caste mon void* en unsigned long* et je retrouve ma valeur. Mais dans le cas ou je ne sais pas que c'est un unsigned long comment je peut faire ??

    Merci pour vos r�ponses !!

  2. #2
    Membre �m�rite

    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
    Par d�faut
    C'est pour cette raison qu'on �vite de traiter des void*.
    En C++ on peut quasiment toujours passer par un �quivalent template :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template <typename T>
    T* func()
    {
      return new T;
    }

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Citation Envoy� par cob59 Voir le message
    C'est pour cette raison qu'on �vite de traiter des void*.
    En C++ on peut quasiment toujours passer par un �quivalent template :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template <typename T>
    T* func()
    {
      return new T;
    }
    Ceci ne marchera pas, tu ne peux pas avoir deux fonctions de m�me nom avec les m�me arguments (ou de m�me avec les m�thodes d'une m�me classe) qui ne diff�rent que par leur type de retour.

    @guitou99999999 :
    Une des solutions serait de stocker dans une structure le pointeur void et un identifiant qui indiquera le type stock� et retourner ta structure au lieu d'un pointeur void mais ce n'est pas tr�s pratique

    Une autre solution serait, au lieu d'utiliser un void * utiliser un std::string au sein d'une classe avec des m�thodes de conversions :
    - implicites : int valeur = monInstance;.
    - explicites : int valeur = (int)monInstance;.
    ou int valeur = monInstance.toInteger(); ou int monEntier ; monInstance.convert(monEntier);.

    On peut aussi ajouter des tests : monInstance.isInteger(); // si la conversion vers un entier est possible.
    Ainsi tu ne pourras pas vraiment savoir le type d'origine mais tu pourras obtenir le "type que tu souhaites".

    Apr�s, difficile de te r�pondre plus pr�cis�ment sans plus de d�tails.

  4. #4
    Membre �m�rite

    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
    Par d�faut
    @Neckara
    Tu confonds surcharge et sp�cialisation.
    Ce code fonctionne, et permet de conserver statiquement l'information du type de la donn�e allou�e, au lieu de la d�truire par un cast en void* :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    template <typename T>
    T* func()
    {
      return new T;
    }
     
    int* i = func<int>();
    double* d = func<double>();

    --edit--
    Si on t'impose des fonctions qui traitent du void*, il y a toujours la possibilit� d'un wrapper. Exemple classique avec des fonctions malloc/free :
    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
     
    // Ce qu'on te fournit
    void* custom_malloc(int type);
    void custom_free(void* ptr, int type);
    int custom_integerType = 1;
    int custom_floatType = 2;
    int custom_doubleType = 3;
     
    // Ton wrapper
    template <T>
    struct Wrapper {
      Wrapper() { ptr = (T*)custom_malloc(CustomType); }
      ~Wrapper() { custom_free(ptr, CustomType); }
      const T& get() const { return *ptr; }
      void set(T& value) { *ptr = value; }
    private:
      T* ptr;
      static int CustomType;
    };
     
    int Wrapper<int>::CustomType = custom_integerType;
    int Wrapper<float>::CustomType = custom_floatType;
    int Wrapper<double>::CustomType = custom_doubleType;
    (...)
     
    Wrapper<int> a;
    a.set(42);
     
    cout << a.get() << endl;
    Pas test�, mais l'id�e est l�.
    La classe Wrapper est simplissime d'utilisation, et tu �vites les mauvaises (d�s)alloc.

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Mea culpa,

    Par contre, tu ne r�ponds pas au probl�me de l'utilisateur car tu pars du principe qu'il sait, lorsqu'il appelle sa fonction quel type sera retourn�e/doit �tre retourn�. Ce qui n'est pas le cas.

    EDIT :
    L'id�e de Wrapper est pas mal, mais en fonction de l'algorithme du posteur, il est possible que cette m�thode ne marche pas.

    Si on veut retourner un "Wrapper" au sein d'une fonction, on ne pourra pas vraiment (on se ram�nerait au probl�me originel).

    Dans ce cas, il faudrait cr�er une classe Mere dont Wrapper h�riterait.
    Puis caster Wrapper en fonction des informations contenus dans Mere.

    Or, on peut aussi penser � fournir dans Mere des m�thodes virtuelles isMachin(), etc...
    Ce qui nous ram�nerait � ma seconde solutions (en d�rivant pour "optimiser" certaines m�thodes en fonctions de certains types particuliers).

    EDIT : par exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    Type foo(void)
    {
          if(...)
                   return int(2);
          if(....)
                   return float(4);
    }
    EDIT :
    Je viens d'y penser mais une solution pourrait aussi �tre :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    struct{
             union{
                        int i;
                        float f;
            }
     
             TypeId id;
    }

  6. #6
    Membre � l'essai
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2013
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Par d�faut
    Merci de vos r�ponses !!

    De ce que je comprends il n'y a pas de m�thode simple. Je vais �tudier tout �a !!

  7. #7
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    C'est le principe du Variant: Une union plus son type.

    Je crois que Boost (et peut-�tre m�me C++11) expose un tel template, permettant de faire un variant sur un ensemble de types.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Sauvegarde d'images valeur point par point
    Par betaplus dans le forum C++
    R�ponses: 6
    Dernier message: 25/02/2015, 10h54
  2. Echec de stockage d'une valeur dans une variable locale point�e par EBP
    Par homeostasie dans le forum x86 32-bits / 64-bits
    R�ponses: 1
    Dernier message: 16/12/2008, 13h52
  3. R�ponses: 3
    Dernier message: 29/07/2008, 09h56
  4. R�ponses: 4
    Dernier message: 11/10/2007, 22h28
  5. R�ponses: 3
    Dernier message: 17/03/2006, 14h50

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