-1

私はこの「単純な」コードを持っています。

union
{
    unsigned int res;
    char         bytes[2];
} ADC;

char ADC_num[5];
float temprature;

void vis_temp (void)        //  Show temp..
{ 
    signed int l, length;
    unsigned int rem;

    GO_nDONE=1;             // initiate conversion on the channel 0   

    while (GO_nDONE) continue;

    ADC.bytes[0]=ADRESL;
    ADC.bytes[1]=ADRESH;

    utoa(ADC_num, ADC.res, 10);

    temprature = (float) ADC.res * 478.1 / 1024;
    temprature = temprature - 50.0;

    l = (signed int) temprature;
    temprature -= (float) l;  
    rem = (unsigned int)(temprature* 1e1);

    sprintf(&ADC_num, "%i.%u", l, rem);

温度が0度以下であることを読み取るADC_resと(ピンの電圧、温度センサー)、プログラムは「-3.5」などではなく「0.65500」と書き込みます。私はその権利をsignedおよびunsignedintとして宣言すべきでした。それを修正するためのヒント、またはそれを変換する他の方法があります。

4

2 に答える 2

2
temprature = (float) ADC.res * 478.1 / 1024;
temprature = temprature - 50.0;

ここtempratureで負の値があるとします-x.yz

l = (signed int) temprature;

l = -x、そして

temprature -= (float) l;

temprature = -x.yz - (-x) = -0.yz

rem = (unsigned int)(temprature* 1e1);

10を掛けて、に変換しunsigned intます。通常、これは未定義の動作になります(6.3.1.4(1)):

実際の浮動小数点型の有限値が以外の整数型に変換されると_Bool、小数部は破棄されます(つまり、値はゼロに向かって切り捨てられます)。整数部分の値を整数型で表すことができない場合、動作は未定義です。61)

61)整数型の値が符号なし型に変換されるときに実行される残りの操作は、実際の浮動型の値が符号なし型に変換されるときに実行する必要はありません。したがって、ポータブル実浮動値の範囲はです(−1, Utype_MAX+1)

ただし、負の値をに変換するunsigned intと、とにかく間違った結果が生成されます。残りの操作が実行された場合でも、必要なのは絶対値なので、変換する必要があります。

rem = (unsigned int)fabsf(temprature * 1e1);

そこの。

于 2013-01-20T15:58:49.583 に答える
1

問題は関数の呼び出しにあるのではないかと思いutoa()ます。

utoa()関数プロトタイプは一般的に次のとおりです

char * utoa(unsigned int n, char * buffer, int radix);

コードでは、最初の2つのパラメーターを反転しています。この呼び出しを介してADC構造を変更しています。これをエラーなしでコンパイルする方法に興味がありますか?まともなコンパイラは、ポインタ型ではない引数を渡すことについて文句を言うでしょう。

次のことを試してください

utoa(ADC.res, ADC_num, 10);
于 2013-01-20T14:31:09.643 に答える