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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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 : 37
    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 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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 : 37
    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