在花了一周的时间检查并通过FastMM4修复我的程序内存泄漏之后,我终于测试了在不同的PC上运行我的程序.现在,我得到"范围检查错误".我花了几个小时在网上研究这个,但他们似乎都没有给我我想要的东西.我的程序符合运行时错误选项范围检查.所以,我知道这就是我收到错误的原因,但我需要确切地知道错误的原因.
该程序是使用Delphi 7.0在XP上编译的.测试PC是Windows 7.一旦启动,我的程序就开始通过串口进行通信,然后是"Range Check Error"消息框.当我停止串行通信时,没有"范围检查错误"框.这是什么意思,我该如何解决它?我正在寻找简单的策略.我知道我可以花几天时间逐行检查.
由于值的分配不正确或访问数组的不可访问的索引而导致的"范围检查错误".我对么?
您对范围检查错误的理解是正确的.当你访问它的边界之外的数组时会出现它们.例如:
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 +}状态中,所有数组和字符串索引表达式都被验证为在定义的范围内,并且所有对标量和子范围变量的赋值都被检查在范围内.