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 :

[C] endian et flottant


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut [C] endian et flottant
    Bonjour,

    Voila, j'aimerais faire une fonction qui transforme mes flottants de little <-> big

    Voici mon code :

    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
     
    void inverse_octets_float(float * img, int nbvalue)
    {
      unsigned char temp[4];
      int i;
     
      for ( i = 0 ; i < nbvalue ; i ++ ) 
     {
        temp[0] = (0xFF000000 & img[i]) >> 24; 
        temp[1] = (0x00FF0000 & img[i]) >> 16; 
        temp[2] = (0x0000FF00 & img[i]) >> 8; 
        temp[3] = (0x000000FF & img[i]) ;     
     
        img[i] = (temp[3] << 24) + (temp[2] << 16) + (temp[1] << 8) + temp[0];
      }
    }
    Il plante a la compil et me dis :
    operandes invalides pour le binaire &
    Comment je peux convertir ces floats?

    Merci a vous

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hie,

    Tu ne peux pas utiliser ton float *img comme un tableau ([I]img)), il faut le transtyper.

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

    En effet, le compilateur ne comprend pas comment appliquer un et binaire à des opérandes flottantes.

    Ce qu'il faut, c'est lui cacher la vrai natures des opérandes et de lui faire croire qu'il travaille avec une opérande de même taille, mais entières :

    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
    void inverse_octets_float(float *img, int nbvalue)
    {
        unsigned char temp[4];
        int i;
        int *tmp = (int *) img;
     
        /* todo : assert sizeof(*tmp) == assert sizeof( * img) */
     
        for (i = 0; i < nbvalue; i++) {
            temp[0] = (0xFF000000 & tmp[i]) >> 24;
            temp[1] = (0x00FF0000 & tmp[i]) >> 16;
            temp[2] = (0x0000FF00 & tmp[i]) >> 8;
            temp[3] = (0x000000FF & tmp[i]);
     
            tmp[i] =
                (temp[3] << 24) + (temp[2] << 16) + (temp[1] << 8) + temp[0];
        }
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Super!

    Hé oui, je me doutais qu'il fallait passer en entier mais je ne voyais pas comment le faire sans perdre ma précision de flottant.
    Il fallait passer par le changement de type du pointeur et non de la valeur!

    Merci beaucoup!!!!

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Par contre, il me semble que la taille d'un "int" n'est pas fixe mais varie en fonction du système (2 ou 4 octets).

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par vince3320 Voir le message
    Voila, j'aimerais faire une fonction qui transforme mes flottants de little <-> big
    Cette manip, une fois mise au point, est horriblement non portable. Tu es-sûr qu'un transfert de donnée en mode texte ne serait pas plus sûr ?

    Quel est ton vrai problème ? J'ai l'impression que tu apportes une mauvaise solution à un vrai problème.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Quel est ton vrai problème ? J'ai l'impression que tu apportes une mauvaise solution à un vrai problème.
    En d'autres mots : ça va faire boum !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/11/2014, 18h57
  2. [Kylix] Kylix3: Pb de virgule flottante
    Par hubble dans le forum EDI
    Réponses: 1
    Dernier message: 22/06/2003, 16h36
  3. Réponses: 8
    Dernier message: 13/01/2003, 17h45
  4. Créer une fenêtre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 10h46
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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