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 tableau de char en float


Sujet :

C++

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut convertir un tableau de char en float
    Bonjour a tous,

    voici mon petit problème,
    je récupère 4 octets provenant d'un équipement dans un tableau de char.
    ces 4 octets représente en réalité un float.

    comment puis je convertir ce tableau de char en un float ?

    j'ai bien tenté de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (unsigned int i =0; i<4; i++) 
    {
     result = result | tableau[i]; 
    result<<8;
    }
    Mais je n'obtient pas le résultat souhaité.

    Merci d'avance.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Tu veux convertir (c'est quoi le format en entree?) ou tu veux le float dont la representation est donnees par des 4 char? Dans ce dernier cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float f;
     
    memcpy((void*)&f, (void*)tableau, sizeof f);

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Je te remercie Jean-Marc.Bourguet ta solution à parfaitement fonctionné et m'a beaucoup aidé.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 127
    Points : 33 037
    Points
    33 037
    Billets dans le blog
    4
    Par défaut
    Est-ce qu'un reinterpret_cast ne ferait pas l'affaire également ?

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Est-ce qu'un reinterpret_cast ne ferait pas l'affaire également ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float f = *reinterpret_cast<float*>(tableau);
    est possible mais suppose qu'il n'y a pas de problemes d'alignement. (Il y a aussi en general un risque de manquement aux regles d'alias, mais dans ce cas je n'en vois pas).

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je suis dans le même cas, mais en ce qui me concerne, cette solution ne fonctionne pas.

    J'ai un tableau d'octets récupéré via une connexion avec un instrument. Ce tableau représentes des valeurs codées en float sur 4 octets.

    Je dois donc convertir les groupes de 4 octets en float, mais aucune des solutions envisagées ne fonctionne.

    J'ai essayé le cast du C, le reinterpret_cast, ainsi que la solution que tu as proposé plus haut mais rien de tout cela n'a fonctionné correctement. A chaque fois, j'obtient des valeurs complètement incohérentes (voire absurdes).

    J'ai même essayé une méthode moins fine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //     array est un tableau de 4 unsigned char
    float* pow;
    pow = array;
    Je ne sais plus quoi essayer d'autre.

    Serais-je obligé d'écrire moi-même l'algorithme de décodage d'un float ? Franchement, je préférerait éviter car ma compréhension limitée de ce système de codage en ferait une source d'erreurs à n'en plus finir.
    Dernière modification par Invité ; 09/08/2012 à 10h59.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    float, c'est un type de representation, c'est pas une representation bien determinee. Bon pour des float sur 4 octets, il y en a une qui domine tres largement depuis 20 ans (dite IEEE 7554) . On va supposer que c'est celle-la mais avec une inversion de boutisme (il y a au moins 3 variantes: grand boutiste, petit boutiste et puis une variante grand boutiste avec une interpretation differente des sNaN).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::swap(tableau[0], tableau[3]);
    std::swap(tableau[1], tableau[2]);
    memcpy((void*)&f, (void*)tableau, sizeof f);
    Si ca ne marche pas, donne la representation que tu recois pour une valeur connue et celle de ton float pour cette meme valeur.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Cela ne fonctionne toujours pas.

    Voici la représentation que j'obtiens pour un float initialisé à -3.44 :
    (dec) 246 40 92 192

    Et voici par exemple le premier groupe de 4 octets de mon tableau (qui devrait normalement approcher de -3.44 à 0.05 près) :

    (dec) 0 1 121 247

    Là, je nage dans le brouillard

    Edit: j'ai testé dans l'autre sens. J'ai créé un tableau d'octets avec les valeurs 246 40 92 192 et là, la conversion en float fonctionne bien. Il semblerait donc que la représentation d'un float dans mon système diffère de celle utilisée par l'instrument qui m'envoie les valeurs.

    Comment puis-je alors identifier la différence et passer de l'une à l'autre ?
    Dernière modification par Invité ; 09/08/2012 à 11h49.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 127
    Points : 33 037
    Points
    33 037
    Billets dans le blog
    4
    Par défaut
    Ce serait pas un problème d'indiens ?
    Auquel cas il n'y a pas de solution magique, il te faut savoir comment les données arrivent, ou les faire partir de la manière de ton choix pour savoir comment elles arrivent.

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il te faut lire la doc de ton instrument pour savoir ce qui est communique. (En passant, j'ai plus souvent vu des représentations en virgule fixe qu'en virgule flottante en instrumentation).

  11. #11
    Invité
    Invité(e)
    Par défaut
    La doc précise qu'il s'agit de float sur 4 octets en Intel byte order et conformes au IEEE Standard.

    D'après ce que que je viens de lire, ce serait donc du little-endiand ?

    Sachant que je tourne sous windows 7 32 bits avec un processeur Intel, ça ne devrait pourtant pas poser de problèmes non ?

    Sinon, il ne me reste qu'à essayer toutes les permutations possibles jusqu'à trouver des résultats cohérents.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Double post pour vous dire que j'ai trouvé l'origine du problème : il n'y en a pas !!!

    Quand j'ai compris le pourquoi du comment, je me suis copieusement fustigé de mon imbécillité. En fait, la conversion fonctionne et la représentation est bien la bonne. Simplement si les chiffres obtenus me semblaient incohérents, c'est parce qu'ils n'étaient pas dans l'unité que le croyais (avec un rapport logarithmique entre les deux, les valeurs n'ont plus rien à voir.

    Voilà, désolé pour ça. Et merci infiniment pour votre aide.

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

Discussions similaires

  1. Convertir un tableau de char en byte
    Par altahir007 dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/09/2011, 14h55
  2. prob string a convertir en tableau de char
    Par lapinette dans le forum Débuter
    Réponses: 11
    Dernier message: 11/06/2010, 08h42
  3. concaténation d'un tableau de char en float
    Par tymop dans le forum Débuter
    Réponses: 5
    Dernier message: 22/03/2009, 22h37
  4. convertir un tableau de caractère en float
    Par zerocoolyoussef dans le forum C
    Réponses: 3
    Dernier message: 20/03/2006, 22h27
  5. Réponses: 1
    Dernier message: 13/10/2005, 15h10

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