u8 PID_Ctrl(float setVal,float CurVal)
{
static unsigned int Cnt = 0;
static u8 JSVal = 0;
if(++Cnt >= 100)
{
Cnt = 0;
JSVal = (u8)PID_SF(setVal,CurVal);
return JSVal;
}
}
//主函式中存在:
PWM_ZB_Val = PID_Ctrl(60, JRL_Real_Temp);
Q:當Cnt<100時,PWM_ZB_Val 等於多少呢?
A:
在修改後的程式碼中,如果 Cnt
小於 100,函式 PID_Ctrl
將不會執行 return JSVal;
這一行。這意味著當 Cnt
小於 100 時,函式不會返回任何值。然而,由於函式簽名指定了返回型別為 u8
(一個無符號的 8 位整數),函式必須返回一個 u8
型別的值。
在 C 語言中,如果函式宣告瞭返回型別,但執行路徑中沒有 return
語句,那麼函式的行為是未定義的。這意味著如果 Cnt
小於 100,PID_Ctrl
函式將返回一些垃圾值,這個值可能是記憶體中該位置原有的任何值。
所以,當 Cnt
小於 100 時,PWM_ZB_Val
將被賦予一個未定義的值,這個值是不確定的,並且沒有意義。在編寫程式碼時,應該確保所有可能的執行路徑都有明確的 return
語句,以避免這種未定義行為。
所以return JSVal;放在if裡邊,會返回垃圾值,我們應該放在外面,又因為JSVal是靜態的,所以當cnt<100的時候,會返回上一次的JSval值:
u8 PID_Ctrl(float setVal,float CurVal)
{
static unsigned int Cnt = 0;
static u8 JSVal = 0;
if(++Cnt >= 100)
{
Cnt = 0;
JSVal = (u8)PID_SF(setVal,CurVal);
}
return JSVal; //Cnt<100時,返回上一次JSVal值
}