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 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
    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 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
    *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 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
    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 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
    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