其他Delphi版本与Cardinals的for循环失败了吗?

时间:2011-01-17 20:11:49

标签: delphi delphi-2009 delphi-2007 delphi-xe

请帮我回归测试,并确定下面的代码在哪个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

- 的Jeroen

4 个答案:

答案 0 :(得分:4)

我想,因为这是一个记录在案的缺陷,所有版本都在High(Cardinal)&gt; High(Longint)(Delphi 4及以上版本)会表现出这种行为。

来自“H2135: FOR or WHILE loop executes zero times - deleted (Delphi)”:

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

答案 1 :(得分:1)

我不确定这是否是杰夫所赞同的真实问题,但这是D2010的输出:

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

Delphi 6产生相同的输出。

答案 2 :(得分:1)

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

编辑:

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

答案 3 :(得分:1)

Delphi 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