范围检查错误和Delphi 7.0

时间:2011-03-28 16:11:19

标签: delphi range

通过FastMM4检查并修复程序内存泄漏一周后,我终于在另一台PC上测试了我的程序。现在,我得到“范围检查错误”。我花了几个小时在网上研究这个,但他们似乎都没有给我我想要的东西。我的程序符合运行时错误选项范围检查。所以,我知道这就是我收到错误的原因,但我需要确切地知道错误的原因。

该程序是在使用Delphi 7.0的XP上编译的。测试PC是Windows 7.一旦启动,我的程序就开始通过串口进行通信,然后是“Range Check Error”消息框。当我停止串行通信时,没有“范围检查错误”框。这是什么意思,我该如何解决它?我正在寻找简单的策略。我知道我可以花几天时间逐行检查。

“范围检查错误”由不正确的值分配或访问数组的不可访问的索引引起。我对么?

2 个答案:

答案 0 :(得分: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或某些此类工具,情况会更好。


<强>更新

由Ken提出,documentation说明了范围检查选项对以下内容的影响:

  

在{$ R +}状态,所有数组和   字符串索引表达式   验证为在定义范围内   边界和标量的所有赋值   和子范围变量检查   在范围内。

答案 1 :(得分:1)

在阅读了有关&#34;范围检查错误&#34;的概念的其他信息后,我认为导致&#34;范围检查错误的原因&#34;在这个场景中是这样的: 用于访问程序读取的串行端口的变量是16字节(或更小)类型,程序读取的串行端口超出了变量的限制。 请注意[当我停止串行通信时,没有&#34;范围检查错误&#34;盒子。],这应该使一切都清楚。