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
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 5
    Points : 4
    Points
    4
    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 éclairé

    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
    Points : 827
    Points
    827
    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
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 5
    Points : 4
    Points
    4
    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 éclairé

    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
    Points : 827
    Points
    827
    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