2011-03-28 24 views
5

花了一個星期檢查並通過FastMM4修復我的內存泄漏程序後,我終於在另一臺PC上運行我的程序。現在,我正在收到「範圍檢查錯誤」。我花了幾個小時在網上進行關於這方面的研究,但他們都沒有給我我想要的東西。我的程序符合運行時錯誤選項範圍檢查。所以,我知道這就是我得到錯誤的原因,但我需要確切地知道錯誤發生的原因。範圍檢查錯誤和德爾福7.0

該程序是在Delphi 7.0上編譯的。測試PC是Windows 7.一旦它啓動,我的程序就開始通過串口進行通信,然後是「範圍檢查錯誤」消息框。當我停止串行通訊時,沒有「範圍檢查錯誤」框。這是什麼意思,我該如何解決它?我正在尋找簡單的策略。我知道我可以花幾天時間逐行檢查。

由值分配不當或訪問數組的不可訪問索引導致的「範圍檢查錯誤」。我對麼?

+0

你可以在其他機器上安裝Delphi並進行調試嗎? – Blorgbeard 2011-03-28 16:12:55

+0

更好的是,我正在考慮通過註釋代碼段並重新編譯來縮小代碼的範圍。然後,測試在Window 7 PC上運行該程序。我知道這將是乏味的,但我想我知道這個程序正在發生什麼樣的部分。 – ThN 2011-03-28 16:31:38

+0

爲什麼不按照我的建議找到地圖文件的違規行? – 2011-03-28 19:24:38

回答

8

您對範圍檢查錯誤的理解是正確的。當你訪問一個超出範圍的數組時,它們就會出現。例如:

type 
    TFixedArray = array [0..41] of Integer; 
var 
    a: TFixedArray; 
begin 
    a[42] := 1+2;//!! this is a range check error !! 
end; 

或爲一個動態數組:

var 
    a: array of Integer; 
begin 
    SetLength(a, 666); 
    a[665] := 12;//this is fine 
    a[666] := 42;//!! this is a range check error !! 
end; 

我已經與分配示出這一點,但讀取與一個索引超出範圍的陣列也將產生一系列誤差。

範圍錯誤應該報告發生的地址,然後您可以使用地圖文件將其轉換爲代碼位置。如果你使用madExcept或者其他的工具,情況會更好。


UPDATE

由Ken提示時,將documentation陳述了由範圍檢查選項如下影響:

在{$ R +}狀態下,所有陣列和 字符串索引表達式 驗證爲在定義的 範圍內,並且標量爲 和子範圍變量的所有分配都被檢查爲 在範圍內。

+0

只是附錄:在{$ R +}狀態下,所有數組和字符串索引表達式都被驗證爲在定義的範圍內,並且標量和子範圍變量的所有賦值都被檢查在範圍內。請注意'string-indexing'和'標量和子範圍變量'。 – 2011-03-28 16:28:25

+0

你的例子很棒,但是你必須使用「666」。大聲笑。 – ThN 2011-03-28 16:28:58

+1

+1這個惡魔的例子:D – 2011-03-28 16:32:45

0

看了其他有關的「範圍檢查錯誤」的概念,我認爲,在這之情況造成的「範圍檢查錯誤」的原因是: 變量分配訪問串行端口的程序讀取是一個16字節(或更小)的類型,程序讀取的串口超出了變量的限制。 請注意,[當我停止串行通信時,沒有「範圍檢查錯誤」框],這應該使所有事情都清楚。