-5

weather.outdooe_tempfloatボタンを押すたびに更新される値です。to関数ですset_temp。それを使用すると機能しますが、以下のコードを使用すると機能しません。floatascii

char Thermo_Buff66[4];
static void SetBox(ScreenObj_t const *pS, EVENT_MSG const *pMsg)
{
    //set_temp(weather.outdoor_temp,&a);//it works if i use this function.
    sprintf(Thermo_Buff66,"%2.1f",weather.outdoor_temp);
    (void)sprintf(Thermo_Buff,"%s\xc2\xb0""",Thermo_Buff66);
    (void)DataBoxHandler(pS, &msg, "Set Temp", (uint8_t *)Thermo_Buff);

    //currently displaying any # value....!!ing!!
 }
4

1 に答える 1

1
char Thermo_Buff66[4];
sprintf(Thermo_Buff66,"%2.1f",weather.outdoor_temp);

割り当てられたバッファ ( Thermo_Buff66) は、屋外温度を表す浮動小数点数 (多くの場合 2 桁) にプラス.1 桁を足すには短すぎます。'\0'実際、終了文字のためのスペースがありません。したがって、すぐに修正するには、サイズを に設定し5ます。それでも、ハルマゲドンの場合 (または単に非 SI 国にいる場合 ... 咳 ... 米国)、温度が 100 を超えることさえあり、その場合もバッファがオーバーフローします。よろしくお願いしますsnprintf

いずれにせよ、sprintfバッファに入ってから、それを別のものに使用し%sますsprintfが、これは意味がありません。Thermo_Buff66以下を完全に削除して、すべてを 1 つにまとめて直接行うことができます。

(void)sprintf(Thermo_Buff, "%.1f\xc2\xb0", weather.outdoor_temp);
(void)DataBoxHandler(pS, &msg, "Set Temp", (uint8_t *)Thermo_Buff);

補足:.と精度の桁はすでに 2 文字を占めています。したがって、最小幅を 2 ​​に設定するのは冗長です。おそらく、2 in は?%2.1の前の桁数だと思ったでしょう。.そうではありません。最小全幅です。

于 2013-03-14T11:24:06.907 に答える