【问题标题】:Range Check Error and Delphi 7.0范围检查错误和 Delphi 7.0
【发布时间】:2011-03-28 16:11:19
【问题描述】:

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

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

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

【问题讨论】:

  • 能不能在另一台机器上安装Delphi调试一下?
  • 更好的是,我正在考虑通过注释掉代码部分并重新编译来缩小有问题的代码行。然后,在 Window 7 PC 上试运行该程序。我知道这会很乏味,但我想我知道这是程序的哪一部分。
  • 你为什么不按照我的建议在地图文件中找到违规行?

标签: delphi range


【解决方案1】:

您对范围检查错误的理解是正确的。当您访问超出其边界的数组时,它们就会出现。例如:

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+} 状态下,所有数组和 字符串索引表达式是 验证为在定义范围内 边界,以及对标量的所有分配 并且子范围变量被检查为 在范围内。

【讨论】:

  • 只是一个附录:在 {$R+} 状态下,所有数组和字符串索引表达式都被验证为在定义的范围内,并且所有对标量和子范围变量的赋值都被检查在范围内.注意string-indexingscalar and subrange variables
  • 你的例子很棒,但你必须使用“666”吗?哈哈。
  • @digitalanalog - 为什么不呢,你最好记住这一点:)
  • 范围检查错误会导致内存泄漏吗?由于当您不检查运行时错误下的“范围检查”时错误被抑制,我确信错误仍然出现但未显示在消息框中。
  • @digitalanalog 越界访问数组可能会导致您能想到的任何故障模式!一旦你开始在内存的随机位上戳,所有的赌注都被取消了。
【解决方案2】:

阅读了有关“范围检查错误”概念的其他信息,我认为导致此场景中的“范围检查错误”的原因是: 分配访问程序读取的串口的变量是16字节(或更小)的类型,程序读取的串口超出了变量的限制。 请注意[当我停止串行通信时,没有“范围检查错误”框。],这应该让所有事情都清楚。

【讨论】:

    猜你喜欢
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多