最近為了簡省運算時間把型態做了簡單的處理
因為我用的是dspic 16bit 的MCU,所以int 代表的是16bit的整數, +32767~-32768
float test;
int test_int;
test 的值範圍為-18~+18,為了讓判斷式和其他變數可以變成整數型態,所以就做了一點手腳
test_int =test*1000;
其中有個副程式是這樣的
int function_a,function_b;
void XXXXXX (VOID){
if (XXXX){
function_a=test_int;
}
if (OOOO){
function_b=test_int;
}
}
從上面看到現在,好像都沒有問題,沒有錯真的沒有問題。
但有趣bug出現在下一支副程式裡。
int ans;
void XXXXXX (VOID){
ans=(function_a+function_b)>>1;
}
不知道大家發現bug了嗎?
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
test 的值範圍為-18~18,為了讓判斷式和其他變數可以變成整數型態,所以就做了一點手腳
test_int =test*1000;
test_int 最大就是-18000 ~+18000
當(function_a +function_b ) >32767時,就會產生ox的bug了
找了好久- -才發現這ox的bug。
把程式改成
void XXXXXX (VOID){
ans=((long)function_a+(long)function_b)>>1;
}
所以這告訴我們,寫程式要專心,思緖要清楚,不然會和我一樣debug這奇怪的bug。
沒有留言:
張貼留言