0

私が理解している限り、nesC本質的に同じである以下の機能があります!C

event void AdaptiveSampling.dataAvailable(error_t result, float val, bool isRealData)
{       
    if(result == SUCCESS)
    {
        //converting raw ADC to centigrade
        centiGrade = -39.60 + 0.01 * val;                       

        //printing the value to serial port
        if(isRealData)
        {
            printf("REAL: Temperature is: %d CentiGrade\r\n", centiGrade); //line 91
            printf("%d,R,%d,%d\r\n", _counter, val, centiGrade); //line 92
        }   
        else
        {
            printf("PEDICTED: Temperature is: %d CentiGrade\r\n", centiGrade); //line 96
            printf("%d,P,%d,%d\r\n", _counter, val, centiGrade); //line 97
        }   
        _counter++;     
    }
    else
    {
        printf("Error reading sensor!");
    }
}

そして、私のコードの先頭で、これらの変数を定義しました:

uint32_t _counter;
uint16_t centiGrade;

これは、ビルド中に表示される警告です。

AdaptiveSamplingC.nc:92:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘uint32_t’ [-Wformat]
AdaptiveSamplingC.nc:92:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘float’ [-Wformat]
AdaptiveSamplingC.nc:97:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘uint32_t’ [-Wformat]
AdaptiveSamplingC.nc:97:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘float’ [-Wformat]

そして、画面上の出力の例を次に示します。

PEDICTED: Temperature is: 26 CentiGrade
291,P,0,-3402
REAL: Temperature is: 26 CentiGrade
292,R,0,4096
PEDICTED: Temperature is: 26 CentiGrade
293,P,0,-1495

問題:

91 行目では、温度の値が float であることが期待されます...つまり、次のようなもの26.25です...しかし、何らかの理由で整数として出力されます。に変更しようとし%dまし%fたが、92行目と97行目の出力がほとんど破損しているため、まだわかりませんでした。

また、92 行目と 97 行目が奇妙な動作をする理由と、ビルド時に警告が表示される理由についても説明がありません。

改善するために何をすべきか教えてください。

4

3 に答える 3

1

あなたの問題は未定義の動作です。そのため、警告が表示されます。警告は、何かが実際に間違っていることを示しています。

printfは可変引数関数であるため、引数の型に関する情報が必要です。それがフォーマット指定子の役割です (例: %d)。

%d警告メッセージが伝えている型付き引数printfを期待するように指示します:警告: 形式は型の引数を期待しますint%dint

ただし、指定する型は s ではありませんint。これらはuint32_tfloatであり、警告メッセージにも示されていますが、引数 2 の型はuint32_t[-Wformat]ですが、引数 3 の型はfloat[-Wformat]です。

いくつかの解決策があります。正しい書式指定子を使用するのが最善です! (当たり前)。それ"%d"は for int"%"PRIu32for uint32_t、および"%f"for ですdouble(これfloatは に昇格します)。の場合、uint32_tにキャストして、代わりに ,unsigned longを使用して出力できます。"%lu"

于 2013-06-03T14:35:07.180 に答える
0

この行で 16 ビットの符号なし整数変数と float 計算を混在させていますcentiGrade = -39.60 + 0.01 * val;

あなたが望むのは、centiGrade を float として保持し、印刷時にのみ int にキャストすることです。

于 2013-06-03T14:32:12.093 に答える
0

警告はすべてを示しています。間違ったフォーマット文字列を指定しています。(覚えておいてください: 警告は変装したエラーです。常に修正してください。)

%u符号なし整数と%f浮動小数点数に使用します。float のフォーマット方法に関する追加情報を提供することもできます。たとえば%.2f、小数点の後ろに 2 つの数字が表示されます。

これも:

centiGrade = -39.60 + 0.01 * val;  

間違っている。に浮動小数点を割り当てることはできませんuint16_t。作るだけcentiGradefloat大​​丈夫です。

指定子の詳細については、http ://www.cplusplus.com/reference/cstdio/printf/ を参照してください。

于 2013-06-03T14:32:23.187 に答える