Re: enregistreurs de température

トップ ページ

このメッセージに返信
著者: Frédéric
日付:  
To: guilde
題目: Re: enregistreurs de température
On mercredi 01 juin 2011, Frédéric wrote:

> Par contre, sur une machine 64bits, le bidule ne démarre pas :o(


Doit y avoir un souci avec le code ci-dessous ; je ne sais pas trop à quoi
il sert (sans doute pour remettre d'aplomb les merdouilles du hardware, qui
semble assez bourrin !).

D'après vous, est-ce qu'il fonctionne de la même façon sur une machine
32bits et 64bits, ou y a-t-il un truc à améliorer ?

/* force byte order (endianness) by casting char -> short int */
#define num2bin_data ((short int *)num2bin_data_char)
char num2bin_data_char[] = 
{
    0x00, 0x00, /*   0 */
    0x80, 0x3F, /*   1 */
    0x00, 0x40, /*   2 */
    0x40, 0x40, /*   3 */
    0x80, 0x40, /*   4 */
    0xA0, 0x40, /*   5 */
...
    0xC4, 0x42, /*  98 */
    0xC6, 0x42, /*  99 */
    0xC8, 0x42, /* 100 */
};


short int num2bin(short int num)
{
    if (num < -NUM2BIN_MAX || NUM2BIN_MAX < num) {
        printf("num2bin: cant convert number %i\n", num);
        return 0;
    }


    if (num < 0)
        return num2bin_data[-num] | SIGN_BIT;
    else
        return num2bin_data[num];
}


short int bin2num(short int bin)
{
    int i, is_negative;


    is_negative = bin & SIGN_BIT;


    if (is_negative)
        bin ^= SIGN_BIT; // unset sign bit


    for (i = 0; i <= NUM2BIN_MAX; i++) {
        if (num2bin_data[i] == bin) {
            if (is_negative)
                return -i;
            else
                return i;
        }
    }


    if (is_negative)
        printf("bin2num: cant convert data %x\n", bin | SIGN_BIT);
    else
        printf("bin2num: cant convert data %x\n", bin);
    return 0;
}


-- 
    Frédéric