2

请帮助我进行回归测试,并确定以下代码在哪些 Delphi 版本中失败。

编辑: 我知道它有一个编译器提示;事实上,在我继承的一个项目中发现,不知何故关闭了编译器提示(我看到很多人这样做,因为他们认为编译器提示总是无害的,这个案例表明它不是)。
我仍然想知道这个编译器异常出现在哪些 Delphi 版本中,以用于文档目的。

[DCC Hint] QC90921_SO4717399TestCase.pas(47): H2135 FOR or WHILE loop executes zero times - deleted

在 Delphi XE、2009、2007 和 5 中,它失败并显示以下输出。
我还没有时间研究其他 Delphi 版本。
请帮助我,并回答其他哪些 Delphi 版本也失败了。

Low/High const fail: 0
Low/High hex literal fail: 0
Low/High decimal literal fail: 0

这也是QC 90921的一部分的代码:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  CardinalIndex: Cardinal;
  CardinalFirst: Cardinal;
  CardinalLast: Cardinal;
  Count: Int64;
  Target: Int64;
begin
  try
    Target := High(Cardinal);
    Inc(Target);

    Count := 0;
    for CardinalIndex := Low(CardinalIndex) to High(CardinalIndex) do
      Inc(Count);
    if Target <> Count then
      Writeln('Low/High const fail: ', Count);

    Count := 0;
    for CardinalIndex := 0 to $FFFFFFFF do
      Inc(Count);
    if Target <> Count then
      Writeln('Low/High hex literal fail: ', Count);

    Count := 0;
    for CardinalIndex := 0 to 4294967295 do
      Inc(Count);
    if Target <> Count then
      Writeln('Low/High decimal literal fail: ', Count);

    Count := 0;
    CardinalFirst := Low(Cardinal);
    CardinalLast := High(Cardinal);
    for CardinalIndex := CardinalFirst to CardinalLast do
      Inc(Count);
    if Target <> Count then
      Writeln('Low/High variable fail: ', Count);

    Count := 0;
    CardinalFirst := 0;
    CardinalLast := $FFFFFFFF;
    for CardinalIndex := CardinalFirst to CardinalLast do
      Inc(Count);
    if Target <> Count then
      Writeln('hex literal Variable fail: ', Count);

    Count := 0;
    CardinalFirst := 0;
    CardinalLast := 4294967295;
    for CardinalIndex := CardinalFirst to CardinalLast do
      Inc(Count);
    if Target <> Count then
      Writeln('decimal literal Variable fail: ', Count);

    Write('Press <Enter>');
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

编辑: 答案摘要;它在这些 Delphi 版本中失败:

  • 5
  • 6
  • 7
  • 2006年
  • 2007年
  • 2009
  • 2010
  • XE

——杰伦

4

4 回答 4

4

我想,由于这是一个记录在案的缺陷,所有High(Cardinal)> High(Longint)(Delphi 4 及更高版本)的版本都会表现出这种行为。

来自“ H2135:FOR 或 WHILE 循环执行零次 - 已删除(Delphi) ”:

如果 FOR 循环将其控制变量从 Longint 范围内的值增加到 Longint 范围外的值,您可能会看到此警告。例如:
var I: Cardinal;
begin
  For I := 0 to $FFFFFFFF do
...
这是由于编译器中的限制,您可以通过将 FOR 循环替换为 WHILE 循环来解决此限制。

于 2011-01-18T01:52:41.647 回答
1

我不确定这是 Jeff 是否赞同的真正 SO 问题,但这是 D2010 的输出:

Low/High const fail: 0
Low/High literal fail: 0
Press <Enter>

Delphi 6 产生相同的输出。

于 2011-01-17T20:22:26.297 回答
1

与 Delphi 7 相同的输出,前两个循环被删除(FOR 或 WHILE 循环执行零次 - 已删除)。请参阅 Sertac Akyuz 的回答。

编辑:

与 Turbo Delphi 2006 相同,前三个循环以相同的提示删除。

于 2011-01-18T09:23:52.170 回答
1

德尔福 2006:

[Pascal Hint] Project1.dpr(20): H2135 FOR or WHILE loop executes zero times - deleted
[Pascal Hint] Project1.dpr(26): H2135 FOR or WHILE loop executes zero times - deleted
[Pascal Hint] Project1.dpr(32): H2135 FOR or WHILE loop executes zero times - deleted

输出:

Low/High const fail: 0
Low/High hex literal fail: 0
Low/High decimal literal fail: 0
于 2011-01-18T13:07:03.727 回答