天天看點

變量溢出引發的錯誤

前幾天II型隧道廣告由于安裝位置由邊牆調整到中牆,這一改動相當于列車到來的方向發生了逆轉,程式需要改動才能适應這種情況。worker_1983網友曾留言說,“還好地鐵隻是朝一個方向開.如果反着開可就有意思了”,可謂一針見血,不過對我們來說不是有意思,麻煩大了。

在改動方面,其實對軟體來說改動量不大,僅對下載下傳的資料有一定調整,由于早期的程式用VB開發(唉,已經幾年沒用VB編寫程式了,代碼看起來很親切),倒是在哪裡插入這段代碼費了我不少時間(由此想到了一個流傳甚廣的小故事,一個有名的工程師解決電機問題後,面對别人的質問時說,畫一根線一美元,知道在哪裡畫需要999美元)。

程式很簡單,如下:

Public Sub PicData(bytData() As Byte)
    … … 
    '------------------------------------------------
   Const intDataSize = 6144 'G_PicWidth * 24
    Dim bytData3(intDataSize) As Byte
    Dim bytData6(intDataSize) As Byte    
    On Error GoTo ToExit '打開錯誤陷阱

    '第3塊資料緩存
    CopyMemory bytData3(0), bytData(intDataSize * 3), intDataSize
    '第5塊資料移到第3塊位置
    CopyMemory bytData(intDataSize * 3), bytData(intDataSize * 5), intDataSize
    '第6塊資料移到第5塊資料位置
    CopyMemory bytData(intDataSize * 5), bytData(intDataSize * 6), intDataSize
    '第3塊資料移動到第6塊位置
    CopyMemory bytData(intDataSize * 6), bytData3(0), intDataSize
    '------------------------------------------------
    … …
    Exit Sub
    '----------------
ToExit:
End Sub           

程式修改編譯後,信心滿滿的給硬體人員進行下載下傳調試了,過了近一天的時間,一問硬體技術人員,說下載下傳資料後,畫面異常,不知道是硬體問題還是軟體問題。隻好把筆記本帶到測試室,和硬體人員一起調試确認。就這麼幾句代碼,費了我不少時間,我才發現問題的所在,第一我發現6144*6一定大于3萬2千多,意味做對integer整型有可能溢出,第二錯誤處理直接退出了,沒有提示(這種做法真危險!),第三定義intDataSize沒有定義類型,預設也就是integer了。

把Const intDataSize = 6144 代碼修改為Const intDataSize  As Long = 6144。

問題搞定。幸好修改的代碼不多,否則這點錯誤還真要命,此外得到教訓是,調試程式時最好把程式錯誤處理暫時關掉(或錯誤存在檔案裡,不過這個時候夠嗆想到去看)。