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

Langage C++ Discussion :

Float et decalage d'octets


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut Float et decalage d'octets
    Bonjour,
    J'ai un problème et je n'ai pas trouver ma réponse sur google alors je viens a vous

    J'ai une fonction template qui doit me retourner un tableau d'octet d'une variable passer en paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BYTE* tab_var = new BYTE[sizeof(T)];
    for(int i=0; i<sizeof(T); i++)
    {
      tab_var[i] = (BYTE)(convert_var >> (i*8));
    }
    mais le décalage de octet pour les type a partis décimale me donne une erreur a la compilation.
    Quelqu'un sait comment utiliser l’opérateur >> pour des type avec partis décimale ?

    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    1. utilise des tableaux à la C++ (-> vecteurs)
    2. utilise des transtypages à la C++ (-> *_cast<>())
    3. pour ton problème, utilise reinterpret_cast<>

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    Si je fait un reinterpret_cast<int> pour après décaler sa risque de changer ma valeur non ?

    Edit:
    Après lecture de la FAQ apparemment non un grand merci a toi !

    Enfaite ça ne marche pas quand même, j'ai toujours la même erreur en fesant comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            BYTE* tab_var = new BYTE[sizeof(T)];
        for(unsigned int i=0; i<sizeof(T); i++)
        {
            tab_var[i] = (BYTE)((reinterpret_cast<int>(convert_var)) >> (i*8));
        }

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Mettre en Résolu, dans ce cas. :-)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    Ca ne marche toujours pas ... voir dernière édition.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Primo, quel est exactement le message d'erreur ?

    Secundo, ton code pourrait être réécrit comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<BYTE> tab_var;
    tab_var.resize(sizeof(T));
     
    for(int i=0; i<sizeof(T); i++)
    {
      tab_var[i] = reinterpret_cast<BYTE>(convert_var) >> (i*8);
    }
    Tertio, il faudra que tu m'expliques quel est l'intérêt d'appliquer un octet un décalage d'un multiple de 8 bits...

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Primo, quel est exactement le message d'erreur ?

    Secundo, ton code pourrait être réécrit comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<BYTE> tab_var;
    tab_var.resize(sizeof(T));
     
    for(int i=0; i<sizeof(T); i++)
    {
      tab_var[i] = reinterpret_cast<BYTE>(convert_var) >> (i*8);
    }

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    1)Désoler je pensais avoir mis l'erreur :
    error: invalid cast from type 'float' to type 'int'

    2)Je ne compte pas utiliser de vector car je n'en ai vraiment pas l'utilité par contre quand je met reinterpret_cast<BYTE> j'ai un message d'erreur du type:
    error: invalid cast from type 'int' to type 'BYTE'

    3)Pour récupéré un octet dans chaque case de mon tableau de BYTE.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    L'utilité d'un vecteur, c'est d'éviter la fuite de ressources en cas d'exception avant que tu atteignes ton delete[]. ENfin bon, c'est toi qui vois...

    Ensuite, je pense que dans la déclaration de ton for, tu peux déclarer i comme étant de type BYTE.

    Enfin, peut-être que tu devrais utiliser le reinterpret_cast comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BYTE x = 42;
    BYTE* pb = reinterpret_cast<BYTE*>(&x);
    tab_var[i] = (*pb) << i*8;
    Je t'avoue que je n'ai que très rarement eu à utiliser reinterpret_cast...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    Enfaite le delete est fait a la fin de la fonction qui est a deux ou trois instruction après la boucle, donc ya franchement peut de risque
    BYTE est un type de qui contient un octet, je veut donc faire un tableau d'octet qui représente ma variable de type float int ou autre.
    Si on veut faire une décomposition du code ce serait plutôt quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BYTE* tab_var = new BYTE[sizeof(T)];
    int variable_int = reinterpret_cast<int>(convert_var);
    for(unsigned int i=0; i<sizeof(T); i++)
    {
           BYTE temporaire = reinterpret_cast<BYTE>(variable_int >> (i*8));
            tab_var[i] = temporaire;
    }
    Je t'avoue que je n'ai que très rarement eu à utiliser reinterpret_cast...
    Pareil pour moi

    ps: je ne répondrais pas avant 19h30.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    Bon enfaite j'ai trouver, d’après MSDN, reintrep_cast ne marche que sur des pointeur donc j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BYTE* tab_var = new BYTE[sizeof(T)];
    for(unsigned int i=0; i<sizeof(T); i++)
    {
    tab_var[i] = static_cast<BYTE>((*(reinterpret_cast<int*>(&convert_var))) >> (i*8));
    }
    Plus d'erreurs et ça fait se que je veux un grand merci a toi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lire le Float qui correspond à 4 octets
    Par petitours dans le forum C#
    Réponses: 5
    Dernier message: 30/08/2011, 22h33
  2. Convertir 1 Float en 1 Tableau de 4 Octet
    Par SEB_GAPE dans le forum C
    Réponses: 12
    Dernier message: 23/05/2007, 15h18
  3. Conversion float -> n octets
    Par Fabllot dans le forum C
    Réponses: 4
    Dernier message: 22/05/2006, 20h00
  4. octet en double ou en float ??
    Par lykim dans le forum Langage
    Réponses: 16
    Dernier message: 16/05/2006, 23h43
  5. Réponses: 27
    Dernier message: 13/01/2006, 23h46

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