访问冲突0040690B delphi

访问冲突0040690B delphi,delphi,for-loop,Delphi,For Loop,我的代码可以正常工作,但不断出现访问冲突错误。 “模块中地址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[n

我的代码可以正常工作,但不断出现访问冲突错误。 “模块中地址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;
我的代码有效

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


如果您在编译器选项中启用范围检查,编译器将能够告诉您这一点。使用范围检查的重要性怎么强调都不过分。使用它,让编译器找到您的缺陷。

+1用于范围检查。就这点而言,还有边界检查。这些编译器选项是为了保护您;除非您真的知道自己在做什么,并且确定不需要它们,否则请使用它们。@MasonWheeler和更新版本的Delphi有多个构建配置,因此您可以禁用它们,只需单击一下即可发布。。。没有理由不使用该选项。您也可以使用旧版本,利用includes和
{$IFDEF Debug}
<代码>{$ELSE}<代码>{$ENDIF}。不像较新版本那么容易,但也不是那么难。@FabricioAraujo实际上,最好不要在生产代码中禁用范围检查,除非您在代码的特定部分有一个经验证的性能问题,这将有助于。。。。。。毕竟,你更喜欢哪一种?(1) 客户抱怨
电子错误
,或(2)客户抱怨您的软件计算错误,因为未检测到的范围问题导致意外的内存覆盖,导致他们花费数千美元。@Craigyong是对的。除非性能是一个问题,否则您也可以让范围检查处于打开状态。“我的代码可以工作,但总是给我访问冲突错误。”-这句话在逻辑上没有任何意义。如果你的代码可以工作,它就不会抛出AV。如果投掷AV是故意的,你不会问这个问题。因此,代码显然不起作用。谢谢。我把“1到7”改为“1到4”,效果很好。谢谢:)