2009年2月3日 星期二

最ox的bug

最近為了簡省運算時間把型態做了簡單的處理


因為我用的是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。


 


 


沒有留言:

張貼留言