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 :

cast sur un void*


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut cast sur un void*
    Je cherche a effectuer un cast sur un element de type void *, car il n'y a qu'a l'execution que je connaitrai le type de mon element.
    J'ai defini une classe qui dans ses membres privés possède une Union de deux structures. Lors de l'appel a une fonction d'une dll, celle ci me fournit la structure avec son type dans le main par exemple, et je voudrais assigner l'element de ma classe avec cette structure. J'ai donc defini une methode du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int RESOURCE_DESCRIPTION::set_ResourceDescription(void* ResourceDescription)
    , je doit donc faire un cast lors de l'appel de la methode pour passer de struct1 ou struct2 en void *
    Apres du coté implementation de la classe, lorsque je recoit mon void*, comment se fait le cast pour assigner dans mon union soit struct1 soit struct2 (qui pointent donc au meme endroit de la memeoire) avec ResourceDescription?

  2. #2
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    SI ton void* ne peut pointer que vers tes 2 strutures, pourquoi n'utilise tu pas ton union en tant que type de ton parametre ?

    De cette façon, dans ta fonction, en fonction de ce dont tu a besoin, tu aura sois l'une, sois l'autre, sans avoir besoin de caster.

    Sinon, les casts en c++ se font toujours de la meme façon :

    static_cast< void* > ( ton object )
    static_cast< object* > (ton void*)

    reinterpret_cast<type>(object) fonctionne aussi tres bien ( mieux ? ) pour ce genre de cas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Par défaut
    j'ai pas bien compris ce que tu voulais faire (peut être j'ai beaucoup coder aujourd'hui ).
    Pour faire un cast d'un void * vers un type que tu connais un exemple tout simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void print(void *ptr){
      char * p = static_cast<char *>(ptr);
      std::cout << "voila : " << p << std::endl;
    }
     
    int main(){ 
      char * ch = "Hello world";
     
      print(ch);
     
      return 0; 
    }
    Je pense que c'est pas une bonne idée de faire ce genre de cast mais bon j'ai pas d'argument pour expliquer ma pensée -_-.
    Sinon pourquoi tu n'utiliser pas des templates au lieu de faire ton cast (void * --> ?)

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Bon le reinterpret ne fonctionne pas, le compilateur m'affiche:

    error C2440: “reinterpret_cast”: “cannot be converted void *” into “struct1”
    Conversion requires a constructor or a user-defined conversion operator, which can be used not of const_cast-Operator or reinterpret_cast-Operator

    Il est surement probable que j'essai de faire quelque chose mais mal. Je redéfini, dans ma classe j'ai une union de structure, car je suis sur que cette classe ne peut comporter que l'une ou l'autre des structures, quand j'appel ma methode pour obtenir mes ressources, celle ci veut un void* comme parametres, et j'ai une variable qui me dit c'est une carte ou c'est un port. Si c'est une carte, j'ai une struct1, sinon une struct2. Pour l'instant, dans ma methode qui recupere la map des ressources, je faisais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DLL_functionGetResource(ID, &myclassElement->struct1Element)
    Avec dans ma classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class RESOURCE
    {
    public:
        unsigned long int type;
        union{
            struct1 struct1Element;
            struct2 struct2Element;
        }
    }
    Ce que je cherche a faire maintenant c'est d'enlever ma structure des membres publics, et donc de définir un setter et un getter pour venir modifier ma structure, sachant que type est la pour m'aider au moment du cast.
    Je cherche donc a definir une et une seule methode qui prendra en parametre un element non typé pour venir au final dans le corps de la öethodes assigner la structure.

    Suis-je clair?
    Donc si quelqu'un a une solution... Evidement je suis prenneur

    ps: Je ne veux pas utiliser de templates car ceux ci servent pour la compilation, ma methode qui recupere toutes les descriptions de cartes et ports est unique, et je cherche a offrir une interface la plus reduite et la plus simple, donc quelque soit le type d'element, le constructeur de ma classe recupert le type et apres avec une methode je viens modifier la structure pour lui assigner l'element.

  5. #5
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    Arf, c'est horrible les fonctions qui acceptent uniquement des void * :/

    Mais bon, c'est pas de ta faute, j'imagine ( API Windows ? ).

    Bref, la, pour le coup, t'as plus le choix, static cast

    Fait bien attention a avoir un systeme d'erreu pour que ton application n'aille pas plus loin si le parametre type que tu reçois ne correspond ni a l'une, ni a l'autre de tes valeur possibles ...

  6. #6
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    le void * vient d'une function non windows mais fournie par le producteur de la carte reseau (pour l'aeronautique)
    Je vais essayer avec le static cast

    Merci je vous tiens au courant pour l'avancement



    [EDIT]Bon vu les différentes tentatives, je me suis finalement rabattu sur la copie membre a membre depuis le void * recupéré vers l'element de ma structure...
    Apparement, ce serait du a la structure qui ne peut accepter le signe = pour l'assignation, le compilo m'injure avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    No operator could be found, *” accepted a rechtsseitigen operator of the type “struct1 (or no suitable conversion possible)
    En faisant la copie un a un, ca compile, je libere donc la memoire apres, mais globalement c'est une grosse perte de temps.... Mais bon, puisque je ne trouve pas la solution, dans un premier temps l'utilisateur s'en contentera...

    Donc sur une solution un peu bancale quand meme je met résolu mais si certains ont des idées, evidement je suis prenneur

    Cdt

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

Discussions similaires

  1. Cast sur un std::vector
    Par albat0r dans le forum SL & STL
    Réponses: 3
    Dernier message: 17/06/2007, 23h07
  2. [Delphi 2006] Pb de cast sur une procédure
    Par NewSoftVision dans le forum Delphi
    Réponses: 5
    Dernier message: 02/05/2007, 08h09
  3. [POO] Erreur suite à un cast sur un objet
    Par RogerB dans le forum Langage
    Réponses: 3
    Dernier message: 02/11/2006, 13h56
  4. probleme d'exception sur du void
    Par lkryss dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2006, 17h45
  5. Réponses: 12
    Dernier message: 31/12/2005, 16h01

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