gpt4 book ai didi

delphi - 如何增加 FOR 循环语句中的 FOR 循环值?

转载 作者:行者123 更新时间:2023-12-03 18:00:26 24 4
gpt4 key购买 nike

我想知道如何增加 FOR 循环语句中的值。

这是我的代码。

function Check(var MemoryData:Array of byte;MemorySignature:Array of byte;Position:integer):boolean;
var i:byte;
begin
for i := 0 to Length(MemorySignature) - 1 do
begin
while(MemorySignature[i] = $FF) do inc(i); //<< ERROR <<
if(memorydata[i + position] <> MemorySignature[i]) then Result:=false;
end;
Result := True;
end;

错误是:E2081 Assignment to FOR-Loop variable 'i'.

我正在尝试将旧代码从 C# 转换为 Delphi,但我无法增加“i”。增加“i”不是唯一的方法,但我想知道问题出在哪里。

最佳答案

当然,其他人(通常)是正确的。没有说的是,循环中的“i” 存在。 Delphi 为它使用一个 CPU 寄存器。这就是为什么你不能改变它,这就是为什么你应该使用“for”循环(而不是“while”),因为“for”要快得多。这是您修改后的代码(未经测试,但我认为您明白了)- 恕我直言,您还有一些错误- 也修复了它们:

function Check(var MemoryData:Array of byte;MemorySignature:Array of byte;Position:integer):boolean;
var i:byte;
begin
Result := True; //moved at top. Your function always returned 'True'. This is what you wanted?
for i := 0 to Length(MemorySignature) - 1 do //are you sure??? Perhaps you want High(MemorySignature) here...
begin
if MemorySignature[i] <> $FF then //speedup - '<>' evaluates faster than '='
begin
Result:=memorydata[i + position] <> MemorySignature[i]; //speedup.
if not Result then
Break; //added this! - speedup. We already know the result. So, no need to scan till end.
end;
end;
end;

...MemorySignature 还应具有“const”或“var”。否则就像现在一样,数组被复制。这意味着每次调用“检查”时都会减速。有了“var”,代码不变的情况下事情要快得多,因为 AFAIS MemorySignature 没有改变。

HTH

关于delphi - 如何增加 FOR 循环语句中的 FOR 循环值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1105519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com