我想知道如何增加FOR-loop语句中的值。
这是我的代码。
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赋值给FOR循环变量'i‘。
我正在尝试将一个旧代码从C#翻译成Delphi,但是我不能增加'i‘。增加“i”并不是唯一的方法,但我想知道问题在哪里。
发布于 2009-07-10 06:57:40
当然,其他人(通常)是正确的。没有说的是,你的循环中的'i‘不存在。Delphi为它使用了一个CPU寄存器。这就是为什么你不能改变它,这就是为什么你应该使用'for‘循环(而不是'while'),因为'for’要快得多。这是你修改过的代码(没有经过测试,但我想你已经明白了)--还有你有一些bugs -也修复了它们:
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;...also MemorySignature应具有'const‘或'var’。否则,就像现在一样,数组将被复制。这意味着每次调用“Check”时速度都会减慢。有了一个'var‘,在代码不变的情况下,事情要快得多,因为MemorySignature没有改变。
HTH
发布于 2009-07-09 18:00:49
在这种情况下,您可以只执行'continue‘而不是inc(i)
发布于 2009-07-09 18:06:33
除了Lasse所写的内容之外,赋值给循环变量通常被认为是一种代码气味。它使代码更难阅读(如果你想过早地离开循环,你可以用break/continue表达得更清楚),而且经常是偶然完成的,导致各种令人讨厌的副作用。因此,Borland (现在的CodeGear)咬紧牙关,将循环变量赋值设为非法,而不是跳过一系列循环,使编译器不再对循环变量进行优化。
如果您真的想手动处理循环索引,请考虑使用while-loop。
https://stackoverflow.com/questions/1105519
复制相似问题