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++Builder Discussion :

Comment additionner 2 octets ?


Sujet :

C++Builder

  1. #1
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut Comment additionner 2 octets ?
    Posts ajouté avant le Rollback

    Citation Envoyé par c_boireau
    Bonjour,

    dans mon application, il y a 2 octets pour la mesure de température : buf[13] et buf[14].
    Lorsque la température est de 25,5°C, buf[13]=FF et buf[14]=00 (cela fonctionne bien), mais lorsque la température dépasse les 25,5°C, par exemple 30,7°C, cela fait buf[13]=33 et buf[14]=01 donc 0133 en héxa = 307 en décimal (30,7°C).

    C'est bien cela mon problème, j'aimerai pouvoir traiter les températures supérieures à 25,5°C mais avec plusieurs tentatives, je n'y arrive toujours pas !

    Si quelqu'un pouvait m'aider svp ?

    Merci pour vos réponses, à bientôt !



    Je poste 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
    17
    18
     
    if ( buf[14] != 0)
    {
     
        unsigned char temp = ( buf[14]<<8 + buf [13]);
     
            fprintf (fichier, "%.1f",  (temp/10));
     
     
        fprintf (fichier, " ");
    //FormClient->FastLineSerieTemperature->AddXY( i, (float) (temp/10) , i, clRed);
    }
    else
    {
        fprintf (fichier, "%.1f", (float)buf[13]/10.0);
        fprintf (fichier, " ");
            FormClient->FastLineSerieTemperature->AddXY( i, ((float) buf [13]/10.0), i, clRed);
    }
    Citation Envoyé par Argol_Medusa
    le unsigned char ne va que de 0 à 255

    remplace :

    unsigned char temp = ( buf[14]<<8 + buf [13]);

    par :

    unsigned int temp = ( buf[14]*256 + buf [13]);

    ça devrait marcher je pense.
    Citation Envoyé par c_boireau
    Merci, cela fonctionne, mais comment faire pour gérer la virgule car cela me met 30°C au lieu de 30,7°C ???

    Citation Envoyé par c_boireau
    C'est ok, j'ai trouvé, excusez moi de vous déranger pour des "broutilles" comme ça !!!


    A bientôt !


  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Il me semble qu'il y a plus simple (tout est relatif...) si on a :

    buf[13] pour l'octet de poids faible (LSB)
    buf[14] pour l'octet de poids fort (MSB)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double val = (*(short*)buf[13]) / 10.0;
    Ce serait intéressant de savoir si ça ne fonctionne pas chez vous !

    A plus !

  3. #3
    Membre très actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Par défaut
    Citation Envoyé par henderson Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double val = (*(short*)buf[13]) / 10.0;
    On reconnait les maniacs des pointeurs

    L'avantage de votre solution c'est qu'elle est plus performente (gain de rapidité CPU) puisqu'aucun calcul n'est fait, c'est juste une lecture de case mémoire.

    question : quand vous écrivez short* c'est un short int* c'est bien cela ? donc un int* tout court ?
    ou bien cela dépend-il des compilateurs je ne sais plus?

  4. #4
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Billets dans le blog
    1
    Par défaut
    ici c'est short car int sur c++ builder fait 32bits, donc short fait 16 bits comme le fait la methode de c++ builder non portable qui est __int16
    sinon le code est bon

  5. #5
    Membre très actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Par défaut
    Autant pour moi, le int est en fait un long int.

    char, unsigned char, signed char 1 byte
    short, unsigned short 2 bytes
    int, unsigned int 4 bytes
    long, unsigned long 4 bytes
    float 4 bytes
    double 8 bytes
    long double 8 bytes

    Merci pour les explications

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Oui ! On a une valeur définie sur deux octets à récupérer, donc via un short !

    En fait BCB sait optimiser. Lorsqu'il lit quelque chose comme :

    short <-- Byte1 << 8 + Byte2
    ou bien :
    short <-- Byte1 * 256 + Byte2
    Dans ce cas il se contente de charger un registre interne 16 bits (ex : la partie CX du registre ECX) : dans H et L (ex : CH et CL) sans faire ni de shift ni de multiplication.
    Ce mécanisme ne nécessite donc que deux instructions machine (Intel).
    A ceci près qu'on a plus à faire à des mouvements en mémoire, de byte à byte (du fait des variables) !
    C'est encore plus frappant avec un int... et je vous laisse en rédiger les shifts !

    Comme cette donnée est interprétée en tant que valeur décimale, je me suis dit que le type double (et non float à cause de son manque de précision) était plus approprié.

    Par contre, le code que j'ai donné mérite d'être contemplé... dans la fenêtre CPU... j'en suis resté... !

    A plus !

  7. #7
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Argol_Medusa Voir le message
    Autant pour moi, le int est en fait un long int.

    char, unsigned char, signed char 1 byte
    short, unsigned short 2 bytes
    int, unsigned int 4 bytes
    long, unsigned long 4 bytes
    float 4 bytes
    double 8 bytes
    long double 8 bytes

    Merci pour les explications
    Long double = 80bits/8 = 10 bytes ou 10 octets
    cf aide de C++ builder 6 dans Constantes et représentation interne

    Types de données 32 bits, tailles et intervalles de valeurs

    Type Taille (bits) Intervalle Applications exemple
    long double 80 3,4*^*10^-4932 <= X <= 1,1*^*10^4932 Financière (précision sur 18 chiffres)

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

Discussions similaires

  1. [MySQL] Comment additionner ?
    Par BertMont dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 14/06/2007, 17h08
  2. comment additionner des champs appartenant à la meme table
    Par VIRGINIE87 dans le forum Langage SQL
    Réponses: 25
    Dernier message: 12/04/2007, 14h40
  3. Réponses: 3
    Dernier message: 16/03/2007, 17h49
  4. Comment additionner les valeurs de 3 labels
    Par morrison29 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 16/11/2006, 19h52
  5. [Excel]Données d'un graph : comment additionner ?
    Par illight dans le forum Excel
    Réponses: 2
    Dernier message: 04/11/2006, 12h30

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