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
    Futur Membre du Club
    Inscrit en
    Août 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 5
    Points : 5
    Points
    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
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    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 averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    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 ).
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  4. #4
    Membre habitué
    Avatar de Aladore
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 70
    Points : 144
    Points
    144
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Pas besoin de (void*), la conversion T* -> void* est implicite
    Boost ftw

  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 239
    Points
    2 239
    Par défaut
    a noté que avec void* le cast qui correspondant est le reinterpret_cast en C++.
    Homer J. Simpson


  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    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 chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 239
    Points
    2 239
    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é.
    Homer J. Simpson


  9. #9
    En attente de confirmation mail

    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 : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    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 chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 239
    Points
    2 239
    Par défaut
    vers un pointeur qui n'a rien à voir avec le type pointé demandé....
    Homer J. Simpson


  11. #11
    En attente de confirmation mail

    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 : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    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. 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