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 :

Convertir un void* en int ...?


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut Convertir un void* en int ...?
    Bonjour,

    Dans le cadre de mon projet de développement d'un mini-jeu, j'éprouve quelques difficultés en utilisant les threads :

    ...
    int move(void *data){
    int num = (int)data;
    ...
    Le code ci-dessus ne marche pas (impossible de convertir void* en int selon le compilateur...) alors je ne sais pas comment faire...

    Merci à tous !

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Le pb est qu'un pointeur vers un objet inconnu n'est pas forcément un entier 32bits.
    data est peut-être un pointeur vers un entier ?

  3. #3
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    Tu ne peux pas caster un pointeur vers un type directement

    tu dois passer par un pointeur

    int num = *((int*)pdata);

    et ca ne fonctionnera QUE a condition que pdata soit effectivement un int* fais tres attention avec ce genre de code.

    XXiemeciel

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int num = reinterpret_cast<int*>(pv);
    !!
    A condition effectivement que pv pointe vers en fait vers un int.
    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...

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    *reinterpret_cast, non?
    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.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    Je veux bien mais vos deux solutions plantent mon programme...!
    Je ne sais plus quoi faire...

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Tu es sûr que ton pointeur pointe sur un int ?

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Citation Envoyé par Médinoc
    *reinterpret_cast, non?
    Arf. Oui tout à fait.
    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...

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par alex6891
    Je veux bien mais vos deux solutions plantent mon programme...!
    Je ne sais plus quoi faire...
    le void*data, c'est quoi EXACTEMENT ?

  10. #10
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    le void*data, c'est quoi EXACTEMENT ?
    La fonction CreateThread prend en paramètre une valeur (de type void* data) pour l'instant je l'ai compris comme étant une valeur qui peut prendre n'importe quel type., seulement je n'arrive pas à passer un entier sans que le compilateur me retourne une erreur...

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    le void * en question pointe sur l'endroit où sont stocké les paramètres, ce n'est pas le paramètre.

    Un tuto sur comment s'en servir après une brève recherche sur google:
    http://www.flipcode.com/articles/art...tithread.shtml

  12. #12
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    ton pointeur est-il bien initialisé ? Es tu sur qu'il n'est pas NULL par exemple ?

    sinon essaye un int* num = static_cast<int*>(pData);
    puis tu travailles ensuite avec ton *num et tu en fais ce que tu veux
    int data = *num; (par exemple.)

    et SI pData est un int*
    SI pData n'est pas NULL
    SI pData a ete initialisé correctement

    Alors ca devrait marcher. Sinon donne nous plus de code que l'on puisse comprendre ce que tu veux faire avec ton programme.

    XXiemeciel

  13. #13
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La fonction CreateThread prend en paramètre une valeur (de type void* data) pour l'instant je l'ai compris comme étant une valeur qui peut prendre n'importe quel type., seulement je n'arrive pas à passer un entier sans que le compilateur me retourne une erreur...
    Tu as mis QUOI EXACTEMENT dans ton CreateThread pour cet argument , l'adresse d'un entier, genre &i ?

  14. #14
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 219
    Par défaut
    tj1 = SDL_CreateThread(move,1); // initialisation
    tj2 = SDL_CreateThread(move,2); // des threads
    Voilà comment j'appelle ma fonction move (en fait je voudrais dans ce cas précis lui passer l'entier 1 pour tj1 et l'entier 2 pour tj2.)
    Dans move, je veux tester si l'argument passé vaut 1 ou vaut 2, et en fonction du résultat, j'exécute un code différent.

    J'espère que ces précisions vous aideront à mieux cerner mon problème !

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Faut passer l'adresse d'une variable, même pour une constante entière comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int i1 = 1, i2 = 2;
    tj1 = SDL_CreateThread(move, &i1); // initialisation
    tj2 = SDL_CreateThread(move, &i2); // des threads
     
    // Dans la fonction du thread...
    const int num = *reinterpret_cast<int*>(data);

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    En effet, j'appuie sur le fait que même si on peut avoir envie de passer un entier là et de faire la conversion ensuite, il ne faut pas oublier les différences de taille: Il est assez fréquent qu'un pointeur soit plus grand qu'un entier, mais l'inverse est aussi possible...

    Donc, là où est demandé un pointeur, on passe un pointeur
    Là où est demandé un entier, on passe un entier.

    La seule exception permise est si la plate-forme ou la librairie fournit des types garantis assez grands pour contenir l'un ou l'autre (comme le type INT_PTR de Microsoft). Mais si une fonction n'attend pas explicitement un tel type, jouer avec les entiers et pointeurs relève du suicide logiciel.


    (bon, j'avoue, quand je débuggue un programme en C, mes *printf() de débogage ont tendance à convertir des pointeurs en entiers (car on a un meilleur contrôle sur le format, on peut donc choisir le plus lisible selon ses propres goûts). Mais ce n'est pas supposé apparaitre dans la version finale, ni en C++ où l'on a assez de contrôle sur le format d'affichage des pointeurs).
    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. [C#] Convertir une String en Int ?
    Par Kylen dans le forum ASP.NET
    Réponses: 12
    Dernier message: 11/04/2012, 10h59
  2. convertir/arrondir double en int
    Par Nicolas_75 dans le forum Langage
    Réponses: 4
    Dernier message: 28/09/2006, 11h38
  3. [(cast)] convertir un char en int...
    Par APoLLoN1234 dans le forum C++
    Réponses: 12
    Dernier message: 15/03/2006, 23h15
  4. convertir un char en int / et prob d'espace
    Par yanchasp dans le forum C++
    Réponses: 20
    Dernier message: 07/02/2006, 19h17
  5. [Conversion]Convertir un char[] en int
    Par ThanosT dans le forum Général Java
    Réponses: 10
    Dernier message: 11/11/2005, 12h23

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