我想知道如何增加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分配到FOR循环变量'i'.
我正在尝试将旧代码从C#转换为Delphi,但我不能增加'i'.增加'i'不是唯一的方法,但我想知道问题出在哪里.
在这种情况下,你可以只做一个'继续'而不是inc(i)
除了Lasse所写的内容之外,分配给循环变量通常被认为是代码气味.它使代码更难阅读(如果你想要保留循环,你可以使用break/continue表达更清晰),并且经常是偶然地完成,导致各种令人讨厌的副作用.因此,不是跳过箍来使编译器不在触及循环变量的任何循环上进行优化fu,而是Borland(现在CodeGear)咬住子弹并将循环变量分配为非法.
如果你真的想手动使用循环索引,请考虑使用while循环.
当然其他的(通常)是正确的.没说的是,循环中的 "我" 不存在.Delphi为它使用CPU寄存器.这就是为什么你不能改变它,这就是为什么你应该使用'for'循环(而不是'while'),因为'for'更快.这是你的代码修改(没有测试,但我认为你有这个想法) - 也有imho你有一些错误 - 修复它们:
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'.否则就像现在一样,数组被复制了.这意味着每次调用'Check'时减速.拥有'var',代码保持不变,因为AFAIS MemorySignature没有改变.
HTH