范围检查错误和Delphi 7.0

ThN*_*ThN 5 delphi range

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

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

由于值的分配不正确或访问数组的不可访问的索引而导致的"范围检查错误".我对么?

Dav*_*nan 8

您对范围检查错误的理解是正确的.当你访问它的边界之外的数组时会出现它们.例如:

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

或者对于动态数组:

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;
Run Code Online (Sandbox Code Playgroud)

我已经通过赋值来说明这一点,但是读取一个索引越界的数组也会产生范围错误.

范围错误应报告发生的地址,然后您可以将其转换为映射文件的代码位置.如果您使用madExcept或某些此类工具,情况会更好.


UPDATE

由Ken提示,文档说明范围检查选项影响的内容如下:

在{$ R +}状态中,所有数组和字符串索引表达式都被验证为在定义的范围内,并且所有对标量和子范围变量的赋值都被检查在范围内.