【问题标题】:access violation 0040690B delphi访问冲突 0040690B delphi
【发布时间】:2014-02-05 15:13:32
【问题描述】:

我的代码有效,但不断给我访问冲突错误。 “模块中地址 00440690B 的访问冲突。读取地址 01F62C42。” 怎么了?我怎样才能让它工作? 第二个循环什么也不做。请帮忙!

Var
   num1, num2, k : Integer;
   LL : string;

begin

LL := '       ';
num1 := 4;
num2 := 4;
  for k := 1 to 7 do
    begin
      LL[num1] := '*';
      LL[num2] := '*';
      redt.Lines.Add(LL);
      num1 := num1 +1;
      num2 := num2 -1;
    end;
  for k := 1 to 3 do
redt.Lines.Add('   *   ');

end;

【问题讨论】:

  • "我的代码可以工作,但一直给我访问冲突错误。" - 从逻辑上讲,这句话没有任何意义。如果您的代码可以工作,它就不会抛出 AV。如果扔 AV 是设计使然,你就不会问这个问题。因此,很明显,代码工作。
  • 谢谢。我将“1 到 7”更改为“1 到 4”并且它起作用了。谢谢你:)

标签: delphi for-loop


【解决方案1】:

我的代码有效。

不,它没有。您正在访问超出范围的LL 元素。在第一个循环的最后一次迭代中,num1 的值为 10num2 的值为 -2。当用作LL 的索引时,这两者都超出了范围。 LL 的有效索引是 17。所以我猜第一个循环应该为14 运行。

如果您在编译器选项中启用范围检查,编译器将能够告诉您这一点。我不能足够强调使用范围检查的重要性。使用它,让编译器发现你的缺陷。

【讨论】:

  • +1 用于范围检查。和边界检查,就此而言。这些编译器选项可以保护您;使用它们,除非你真的知道自己在做什么并且你确定你不需要它们。
  • @MasonWheeler 并且较新版本的 Delphi 有多种构建配置,因此您可以禁用它们,仅通过单击发布...没有理由不使用这些选项。
  • 您也可以使用旧版本,使用包含和{$IFDEF Debug} ... {$ELSE} ... {$ENDIF}。不像新版本那么容易,但也没有那么难。
  • @FabricioAraujo 实际上,最好不要在生产代码中禁用范围检查,除非您在特定的代码部分中存在已证明的性能问题,这将受益......毕竟,你会更喜欢? (1) 客户抱怨 ERangeError,或 (2) 客户抱怨您的软件中的计算错误,因为您有意外的记忆,导致他们损失了数千美元由于未检测到的范围问题而覆盖。
  • @CraigYoung 是对的。除非性能是一个问题,否则您最好不要进行范围检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多