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 :

Utilisation de void* avec structures


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Ao�t 2010
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2010
    Messages : 5
    Par d�faut Utilisation de void* avec structures
    Bonjour,
    je travaille actuellement sur un projet en C/C++ sur lequel je rencontre des probl�mes.

    En fait j'ai une fonction qui utilise des structures d�finies comme suit :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct{
      int id;
      void* value;
    }Record
     
    struct{
      int id;
      int type;
    }Event;
    La fonction se d�finit comme suit :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int fonction(Record* pData)
    {
         //Récupération de données
         pData->id = 10;
     
         //Création d'une variable de type Event
         Event event;
         event.id = 2;
         event.type = 5;
    }
    En fait, je veux dans la fonction ensuite, que le membre de pData, "value", stocke la variable "event". Je pensais utilise "Event*" mais apr�s je sais pas comment effectue le cast avec "void*".
    Donc si quelqu�un a une id�e. Merci.

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    D�veloppeur C
    Inscrit en
    Ao�t 2004
    Messages
    2 366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur C

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 2 366
    Par d�faut
    Tu as un gros probl�me dans ton code actuel.
    est locale � la fonction, donc tu vas perdre les info d�s que tu vas sortir de la fonction. Il faut allouer soi-m�me la m�moire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
         //Création d'une variable de type Event
         Event *event = new Event;
         event->id = 2;
         event->type = 5;
    Apr�s tu fais un cast :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    pData->value = (void *)event;
    Et quand tu voudras r�cup�rer tes donn�es tu feras :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Event *event = (Event *)tonRecord->value;
    Et
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Record{
      int id;
      void* value;
    };
     
    struct Event{
      int id;
      int type;
    };
    c'est mieux comme d�claration.

  3. #3
    Membre exp�riment� Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Par d�faut
    Il faudra aussi penser � lib�rer la m�moire allou�e dans l'exemple de fregolo52. L'utilisation des static_cast ne fera pas de mal non plus au lieu du C-style cast (cf FAQ ici ).

  4. #4
    Membre actif
    Avatar de Aladore
    Profil pro
    �tudiant
    Inscrit en
    Avril 2009
    Messages
    70
    D�tails du profil
    Informations personnelles :
    �ge : 36
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 70
    Par d�faut
    C'est du C ou du C++ ?
    Si c'est du C++ je te conseille de plut�t passer par des template au lieu d'un pointeur sur void. Enfin apr�s �a d�pend ce que tu souhaites faire avec ta structure Record, mais bon.

  5. #5
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

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

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    Pas besoin de (void*), la conversion T* -> void* est implicite

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    a not� que avec void* le cast qui correspondant est le reinterpret_cast en C++.

  7. #7
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Non. La conversion depuis les void* se fait avec un static_cast.

    Et +1 � Aladore. Les templates, c'est bien mieux. Je suis surpris que personne n'aie r�agis plus t�t.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  8. #8
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    La conversion depuis les void* se fait avec un static_cast.
    Depuis oui, je parlais de conversion de void* en autre choses, je n'ai pas �t� assez pr�cis.

    Edit: "en pointeur d'autre chose", le static_cast n'accepteras pas caster vers un pointeur qui n'a rien � voir avec le type point� demand�.

  9. #9
    Membre Expert

    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2004
    Messages
    1 391
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Doubs (Franche Comt�)

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

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 391
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    void* p1 = new int();
    int* p2 = static_cast<int*>(p1);
    Marche tr�s bien. Avoir besoin d'un reinterpret_cast c'est plus rare (quand il n'y a aucun lien entre les types).

  10. #10
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    vers un pointeur qui n'a rien � voir avec le type point� demand�....

  11. #11
    Membre Expert

    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2004
    Messages
    1 391
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Doubs (Franche Comt�)

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

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 391
    Par d�faut
    Je ne comprend pas ce que tu veus dire. Les seules donn�es qu'on a c'est le type statique de l'objet � caster (ici void*) et le type vers lequel on veut aller (celui entre <>).

    Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.
    (norme) Et dans la liste je ne vois pas de conversion depuis un pointeur vers un pointeur sur un objet.

    Il y a bien un pointeur sur un objet de type T1 vers un pointeur sur un objet de type T2, mais je ne suis pas certain que ca s'applique avec T1 = void et si c'est le cas alors c'est strictement �quivalent � un static_cast d'un pointeur vers un pointeur sur un objet de type T2.

    Finalement, faire un reinterpret_cast depuis un pointeur (void*) vers un pointeur sur un objet de type T2 (T2*), ie reinterpret_cast<T2*>(p); avec void* le type statique de p, ne sert jamais � rien. (sauf cas sp�cial o� T2* est un type entier)

    Si ce n'est pas ce que tu disais, alors je n'ai rien compris � ce que tu as dit.

Discussions similaires

  1. [EF] l'utilisation du framework avec une structure d'application complexe
    Par Wasrack dans le forum Acc�s aux donn�es
    R�ponses: 2
    Dernier message: 14/10/2009, 10h36
  2. R�ponses: 2
    Dernier message: 23/02/2009, 11h23
  3. Utilisation de fichiers avec une structure
    Par showdown dans le forum C
    R�ponses: 16
    Dernier message: 07/12/2006, 18h30
  4. utilisation de dll avec diverses compilateurs
    Par Thylia dans le forum C++
    R�ponses: 30
    Dernier message: 21/10/2004, 16h30
  5. Utiliser Borland C++ avec Emacs sous Windows
    Par Eikichi dans le forum Autres �diteurs
    R�ponses: 2
    Dernier message: 02/03/2003, 08h40

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