W1037 for ループ脱出後のループ制御変数 '%s' の値は不定です (Delphi)

提供: RAD Studio
移動先: 案内検索

エラーと警告のメッセージ(Delphi):インデックス への移動

この警告は for ループの制御変数の値をループの後に使った場合に表示されます。

for ループの制御変数の最終値をあてにしてもよいのは,goto 文か Exit 文でループを出た場合だけです。

これはコンパイラが for ループに効率的なコードを生成できるようにするための制約事項です。


program Produce;
(*$WARNINGS ON*)

function Search(const A: array of Integer; Value: Integer): Integer;
begin
  for Result := 0 to High(A) do
    if A[Result] = Value then
      break;
end;

const
  A : array [0..9] of Integer = (1,2,3,4,5,6,7,8,9,10);

begin
  Writeln( Search(A,11) );
end.

{ このコードではループの後で Result 変数が暗黙に使用されているが,ループを完了した場合,Result は未定義となる。そのために警告が表示される }


program Solve;
(*$WARNINGS ON*)

function Search(const A: array of Integer; Value: Integer): Integer;
begin
  for Result := 0 to High(A) do
    if A[Result] = Value then
      exit;
  Result := High(a)+1;
end;

const
  A : array [0..9] of Integer = (1,2,3,4,5,6,7,8,9,10);

begin
  Writeln( Search(A,11) );
end.

{ ループを完了した場合に備えて,意図する値を単に制御変数へ代入すれば解決する }