新聞中心

EEPW首頁 > 牛人業(yè)話 > 數(shù)組越界真可怕,莫名就闖到了別人家

數(shù)組越界真可怕,莫名就闖到了別人家

作者:天雷君 時(shí)間:2018-11-30 來源:電子產(chǎn)品世界 收藏

  第一步,打開冰箱,即計(jì)算出該數(shù)據(jù)位的字節(jié)位置和位位置,如前所述,第n+1個(gè)數(shù)據(jù)位的字節(jié)位置為(n>>3),位位置為(n & 0x07),這是通過下面這個(gè)函數(shù)實(shí)現(xiàn)的,

本文引用地址:http://2s4d.com/article/201811/395096.htm

  void SetByteBitIdx(void)

  {

  uint16_t idx;

  idx = Rf_bit_count;

  Rf_rawbyte_idx = idx >> 3;

  Rf_rawbit_idx  = idx & 0x07;

  Rf_bit_count++;

  }

  第二步,把數(shù)據(jù)位0或1這個(gè)‘大象’放到前面打開的‘冰箱’里,這是通過下面這個(gè)函數(shù)實(shí)現(xiàn)的。

  void StoreRfBit (bool data)

  {

  SetByteBitIdx();

  if(1 == data){

  Rx_rawbit[Rf_rawbyte_idx] |= 1 << Rf_rawbit_idx;

  }else{

  Rx_rawbit[Rf_rawbyte_idx] &= ~(1 << Rf_rawbit_idx);

  }

  }

  乍看下來,設(shè)計(jì)方案構(gòu)思縝密,程序代碼實(shí)現(xiàn)巧妙,設(shè)計(jì)和實(shí)現(xiàn)都堪稱天衣無縫。按下遙控器,射頻信號在空間汩汩流動(dòng),遙控接收板有序地把數(shù)據(jù)整齊碼好,踏著相同的節(jié)拍,大家一起嗨起來。

  3

  但是,理想是美好的,現(xiàn)實(shí)永遠(yuǎn)是骨感的。

1543555728229384.jpg

  小心翼翼地把代碼寫好,反復(fù)檢查了幾遍,水平有限,著實(shí)檢查不出來任何毛病,那就是騾子是馬,拉出來溜溜吧。結(jié)果,一通測試下來,興奮勁還沒過去,一頭冷水便照頭潑了下來。按了遙控鍵,十次中倒有個(gè)兩三次不好使,“永不消逝的電波”就好像泥牛入海,轉(zhuǎn)眼間便走散了消息,不見了蹤跡。

  被風(fēng)撕碎的一片片白云在遼闊高遠(yuǎn)的天空中肆意飄蕩著,火紅的太陽炙烤著滾燙的大地。灑家背靠窗臺(tái),一面感受著頑強(qiáng)得透過隔溫玻璃的陽光灑在脊背上的暖意,一邊在空調(diào)房中體味著心中的陣陣寒意。電波到底去哪兒了?

  灑家搜索的目光在電腦屏幕上不斷游離,心中條分縷析,早把各行代碼都當(dāng)成了嫌疑,最后,目光定格在判斷接收到一幀完整的報(bào)文的語句那里:

  if(Rf_bit_count >= RF_RAWBIT_LEN){

  SetRfFrameComplete();

  }

  基本上,鑰匙每短按一次,就會(huì)發(fā)送三幀報(bào)文,既然遙控不好使,大抵可以確認(rèn)中間存在漏報(bào)文的情形,為了驗(yàn)證這種猜測,灑家加了一條測試語句:

  if(Rf_bit_count >= RF_RAWBIT_LEN){

  Rf_frame_times++;

  SetRfFrameComplete();

  }

  顯然,短按一次,Rf_frame_times應(yīng)該為3,短按n次,Rf_frame_times應(yīng)該為(n*3)。

  馬不停蹄地測試下來,果不其然,短按過十次后,Rf_frame_times的值不到30。難道是報(bào)文解析程序出了問題?




關(guān)鍵詞: 數(shù)組

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉