作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道如何增加 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/
我是一名优秀的程序员,十分优秀!