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

これは、 QC90921の一部でもあるコードです。

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

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

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
于 2011-01-18T13:07:03.727 に答える
1

これがJeffが承認する本当のSOの質問かどうかはわかりませんが、D2010からの出力は次のとおりです。

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

Delphi6は同じ出力を生成します。

于 2011-01-17T20:22:26.297 に答える
1

Delphi 7と同じ出力で、最初の2つのループが削除されます(FORまたはWHILEループはゼロ回実行されます-削除されます)。SertacAkyuzの回答を参照してください。

編集:

Turbo Delphi 2006と同じように、最初の3つのループは同じヒントで削除されます。

于 2011-01-18T09:23:52.170 に答える