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++/CLI Discussion :

DWORD to Float via un swap


Sujet :

C++/CLI

  1. #1
    Membre � l'essai
    Inscrit en
    Novembre 2006
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 5
    Par d�faut DWORD to Float via un swap
    Bonjour,

    J'ai un petit probl�me qui m'intrigue. J'essaie d'inverser un les deux mots constituants un float. A|B|C|D en ---> C|D|A|B

    Je transforme mon float en DWORD, j'effectue mon swap (transformation) puis je caste en float.. mais �a ne donne pas le r�sultat souhait�.

    Voici mon code. Si vous voyez un truc bizarre n'h�sitez pas svp, je suis bloqu�!

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    DWORD value = 12345;
    value =(LOWORD(value)<<16)+ HIWORD (value);
    fvalue= (float)value;
    Merci par avance!

  2. #2
    Membre chevronn�

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par d�faut
    Salut,

    Si tu affiche les valeurs en Hexa ton code est bon me semble-t-il... Moi j'obtiens bien "A|B|C|D ---> C|D|A|B" dans le DWORD. C'est le cast en float qui pause probl�me.

    Es-ce que ceci te convient? Chez moi, �a fonctionne :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    DWORD value = 12345;
     
    DWORD *Dpt = &value;
    float *fpt = reinterpret_cast<float*>(&value);
     
    value =(LOWORD(value)<<16)+ HIWORD (value);
     
    float fvalue = (*fpt);
    C'est le ton cast en float que causait le probl�me, il faut faire un reinterpret_cast � la place, donc passer par des pointeurs sur les deux types � "r�interpr�ter".

  3. #3
    Membre � l'essai
    Inscrit en
    Novembre 2006
    Messages
    5
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 5
    Par d�faut
    Je n'ai pas test� votre code. Mais il me semble qu'il r�pond au probl�me.

    Sinon ce bout de code est plus "performant" et �a marche :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    union
    {
        DWORD i;
        float f;
    } u;
     
    u.i = 0x713D2242; 
    u.i = (LOWORD(value) << 16) + HIWORD(value); 
    float fvalue = u.f;
    Merci quand m�me!!

  4. #4
    Membre chevronn�

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par d�faut
    C'est vrai que le passage par une union �vite le reinterpret_cast : Simple et efficace! Bravo

    Attention :Si tu veux que ton code soit portable v�rifie avant �a que sizeof(float) et sizeof(DWORD) sont �gaux!!

    Je ferais mieux la prochaine fois... j'esp�re!

    PS : n'oublie pas de cocher ce post comme r�solu

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Indenter l'affichage de float via printf
    Par darkwall_37 dans le forum D�buter
    R�ponses: 2
    Dernier message: 27/09/2010, 14h33
  2. [Kylix] PostgreSql via ODBC
    Par doykati dans le forum EDI
    R�ponses: 3
    Dernier message: 08/02/2007, 10h10
  3. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    R�ponses: 8
    Dernier message: 25/11/2002, 04h09
  4. R�ponses: 4
    Dernier message: 05/06/2002, 12h15
  5. [Kylix] Excel via kylix
    Par Billy joel dans le forum EDI
    R�ponses: 1
    Dernier message: 23/05/2002, 11h57

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