访问冲突0040690B delphi
我的代码可以正常工作,但不断出现访问冲突错误。 “模块中地址00440690B的访问冲突。读取地址01F62C42。” 怎么了?我怎样才能让它工作呢? 第二个循环什么也不做。请帮忙访问冲突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
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”,效果很好。谢谢:)