W1036 変数 '%s' は初期化されていない可能性があります (Delphi)

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

エラーと警告のメッセージ(Delphi) への移動


この警告は、変数に値が割り当てられていない場合に、それが使用されるポイントへ導くコード パスにくるたびに表示されます。

program Produce;
(*$WARNINGS ON*)
var
  B: Boolean;
  C: (Red,Green,Blue);
procedure Simple;
var
  I : Integer;
begin
  Writeln(I);        (* <-- ここで警告 *)
end;
procedure IfStatement;
var
  I : Integer;
begin
  if B then
    I := 42;
  Writeln(I);        (* <-- ここで警告 *)
end;
procedure CaseStatement;
var
  I: Integer;
begin
  case C of
  Red..Blue: I := 42;
  end;
  Writeln(I);        (* <-- ここで警告 *)
end;
procedure TryStatement;
var
  I: Integer;
begin
  try
    I := 42;
  except
    Writeln('Should not get here!');
  end;
  Writeln(I);        (* <-- ここで警告 *)
end;
begin
  B := False;
end.

if 文では、変数が分岐の両方で、割り当てられていなければなりません。case 文では、else 部を追加し、想定されるすべてのケースにおいて、変数に値が割り当てられるようにしなければなりません。try-except 構造文では、コンパイラは、try 部での割り当ては実際には行われなかった、と想定します。これは、割り当て処理が try 部の一番最初の部分にあり、例外を起こすことは考えられないほど単純だとしてもです。

program Solve;
(*$WARNINGS ON*)
var
  B: Boolean;
  C: (Red,Green,Blue);
procedure Simple;
var
  I : Integer;
begin
  I := 42;
  Writeln(I);
end;
procedure IfStatement;
var
  I : Integer;
begin
  if B then
    I := 42
  else
    I := 0;
  Writeln(I);        (* else 部で I の割り当て処理が必要 *)
end;
procedure CaseStatement;
var
  I: Integer;
begin
  case C of
  Red..Blue: I := 42;
  else       I := 0;
  end;
  Writeln(I);        (* else 部で I の割り当て処理が必要 *)
end;
procedure TryStatement;
var
  I: Integer;
begin
  I := 0;
  try
    I := 42;
  except
    Writeln('Should not get here!');
  end;
  Writeln(I);        (* try の前に I の割り当てが必要 *)
end;
begin
  B := False;
end.

解決策は、割り当てが欠落しているコード パスに割り当て処理を追加するか、条件文や try-except 構造文の前に、割り当て処理を追加します。