当前位置:  开发笔记 > 编程语言 > 正文

如何在FOR循环语句中增加FOR循环值?

如何解决《如何在FOR循环语句中增加FOR循环值?》经验,为你挑选了3个好方法。

我想知道如何增加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'不是唯一的方法,但我想知道问题出在哪里.



1> Michael Dono..:

在这种情况下,你可以只做一个'继续'而不是inc(i)



2> Paul-Jan..:

除了Lasse所写的内容之外,分配给循环变量通常被认为是代码气味.它使代码更难阅读(如果你想要保留循环,你可以使用break/continue表达更清晰),并且经常是偶然地完成,导致各种令人讨厌的副作用.因此,不是跳过箍来使编译器不在触及循环变量的任何循环上进行优化fu,而是Borland(现在CodeGear)咬住子弹并将循环变量分配为非法.

如果你真的想手动使用循环索引,请考虑使用while循环.



3> John Thomas..:

当然其他的(通常)是正确的.没说的是,循环中的 "我" 存在.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


'Break'表示"Out of the current LOOP"(for etc.),而'Exit'表示"Out of the current CODE BLOCK"(程序/功能等).在我们的具体情况中,是的,*是*相同,但(imho)是一个很好的编码习惯,在最后的'结束'终止函数.当然这是一般规则,而不是教条.让我们假设其他人接受了代码并且他决定在每次检查后他必须擦除(IOW填充#$ 00)MemorySignature,而不管函数的结果如何.本能地他最后会添加一个'for'循环.如果中间有一个"退出",则该代码*有时会被滑落.
`for`绝对不能保证索引变量将被放在一个寄存器中(这应该是显而易见的,因为你可以清楚地写出足够多的嵌套`for`循环,因为没有足够的寄存器来放入变量!).此外,优化器还可以(并且)将其他变量放入寄存器中.最后,将变量放入寄存器对其可变性没有影响 - 寄存器显然可以分配给与内存位置相同的内容.总的来说,这是一个可怕的解释,它既可以在事实上不正确,也可以分散实际问题.
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有