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 :

fonction 4 octets en float


Sujet :

Langage C++

  1. #21
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Goten Voir le message
    char (et unsigned char) sont des cas spéciaux, c'est autorisé et c'est pas une UB. (ouai fin, la conversion marche que dans un sens du coup)
    Aurais-tu une référence ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  2. #22
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Aurais-tu une référence ?

    La norme :

    3.10 p15 :
    If a program attempts to access the stored value of an object through an lvalue of other than one of the following
    types the behavior is undefined48):
    -the dynamic type of the object,
    ....
    -a char or unsigned char type.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #23
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je ne lis pas la même chose que toi dans cette liste (mais je ne suis pas un expert du standardese, je peux très bien me planter) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    union U
    {
      unsigned char c;
      float f;
    };
     
    U u;
    u.f = 3.14;
    Telle que je lis la liste, on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char*s = reinterpret_cast<unsigned char*>(&u);
    cout << s[0];
    Mais le code suivant reste indéfini :
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #24
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    @JolyLoic : Si une union U a 2 membre (n de type N et m de type M) et que c'est n qui est actif, alors l'expression u.m (u de type U) n'est pas une lvalue de type M ?

  5. #25
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Pour moi, c'est effectivement une lvalue de type M, mais qu'on n'a pas le droit de convertir en prvalue. Je ne trouve aucun texte pour corroborer ce point de vue, et en particulier pour définir précisément ce que signifie "actif".
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #26
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Si c'est bien un lvalue alors je serais plutôt de l'avis de Goten, ce n'est pas un UB car on accède à un objet via une lvalue de type char, c'est ce que je comprend du passage cité par Goten.

    Pour le actif, c'est dans la définition que la norme (n3290) fait d'une union, mais à part les paragraphes sur les unions ce n'est pas détaillé ailleurs.

  7. #27
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    @JolyLoic : Si une union U a 2 membre (n de type N et m de type M) et que c'est n qui est actif, alors l'expression u.m (u de type U) n'est pas une lvalue de type M ?
    Si c'est bien cela, et en effet ça tombe dans le paragraphe que j'ai cité (si on accède avec un char). J'en suis sur à 99%, faudrait poster sur clc++m pour le pour-cent restant :p
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  8. #28
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Re-Bonjour, soit on s'écarte du sujet, soit je n'arrive plus à suivre la discussion ^^. Du coup, je ne sais pas trop quelle méthode employer... Il faudrait peut être que je fasse un code qui réalise la conversion pas à pas des octets en float (calcul de la mantisse, etc...), mais ça sera peut être plus long à l'éxécution...

    Dailleurs le problème maintenant est que plusieurs méthodes fonctionnent mais j'obtiens toujours des valeurs arrondies...

    EDIT : Bon tout fonctionnne, même au niveau de la précision :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     unsigned char result[4];
        float * f;
        float flt;
        if(cpu_type==2){
            result[0] = getOctet(fichierstdf);
            result[1] = getOctet(fichierstdf);
            result[2] = getOctet(fichierstdf);
            result[3] = getOctet(fichierstdf);
        }else{
            result[3] = getOctet(fichierstdf);
            result[2] = getOctet(fichierstdf);
            result[1] = getOctet(fichierstdf);
            result[0] = getOctet(fichierstdf);}
     
        //f=(float *)result;
       //flt =*f;      fonctionne aussi
     
        memcpy(&flt, &result,sizeof(float));
     
        return flt;
    Merci à tous en tout cas

  9. #29
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Goten Voir le message
    Si c'est bien cela, et en effet ça tombe dans le paragraphe que j'ai cité (si on accède avec un char). J'en suis sur à 99%, faudrait poster sur clc++m pour le pour-cent restant :p
    J'ai posté sur les mailing lists du comité de normalisation, et j'ai eu une réponse de Jens Maurer, qui est d'accord avec ton interprétation, même s'il est prudent dans son accord. Je le cite :
    It seems to me that the exception for "unsigned char" does apply, thus the above is not undefined behavior. However, the value you get for "u.c" is unspecified, except that (I think) you can expect it to remain stable until you modify "u" next.
    . Il suggère aussi de lire les core issues 1116 et 636. Avec le réordonnancement proposé par 1116, je deviens moi aussi d'accord.

    Mais tout ça me conforte que dans la mesure du possible, j'éviterais d'utiliser des unions dans du code que j'écris, c'est bien trop casse gueule

    Eames38 : Ce que tu peux retenir de notre chipotage c'est que la conversion à base d'union n'est pas garantie de fonctionner, surtout dans le sens char[] => float.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Dégrossir ma fonction qui lit des floats.
    Par disturbedID dans le forum C
    Réponses: 6
    Dernier message: 16/04/2007, 02h08
  2. Conversion float -> n octets
    Par Fabllot dans le forum C
    Réponses: 4
    Dernier message: 22/05/2006, 20h00
  3. octet en double ou en float ??
    Par lykim dans le forum Langage
    Réponses: 16
    Dernier message: 16/05/2006, 23h43
  4. fonction qui transforme un entier en octet
    Par personne64 dans le forum C
    Réponses: 43
    Dernier message: 10/05/2006, 15h36
  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