W1036 La variable '%s' n'est peut-être pas initialisée (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Messages d'erreur et d'avertissement (Delphi)

Cet avertissement est donné si une variable n'a pas eu de valeur affectée sur chaque chemin de code menant au point où elle est utilisée.

program Produce;
(*$WARNINGS ON*)
var
  B: Boolean;
  C: (Red,Green,Blue);

procedure Simple;
var
  I : Integer;
begin
  Writeln(I);        (* <-- Avertissement ici *)
end;

procedure IfStatement;
var
  I : Integer;
begin
  if B then
    I := 42;
  Writeln(I);        (* <-- Avertissement ici *)
end;

procedure CaseStatement;
var
  I: Integer;
begin
  case C of
  Red..Blue: I := 42;
  end;
  Writeln(I);        (* <-- Avertissement ici *)
end;

procedure TryStatement;
var
  I: Integer;
begin
  try
    I := 42;
  except
    Writeln('Should not get here!');
  end;
  Writeln(I);        (* <-- Avertissement ici *)
end;

begin
  B := False;
end.

Dans une instruction if, vous devez vérifier que la variable est affectée dans les deux branches. Dans une instruction case, vous devez ajouter une partie else pour vérifier que la variable a une valeur affectée dans chaque cas concevable. Dans une construction try-except, le compilateur présume que les affectations de la partie try peuvent en fait ne pas arriver, même si elles sont au tout début de la partie try et si simples qu'elles ne peuvent pas provoquer une exception.


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);        (* Doit affecter I dans la partie else *)
end;

procedure CaseStatement;
var
  I: Integer;
begin
  case C of
  Red..Blue: I := 42;
  else       I := 0;
  end;
  Writeln(I);        (* Doit affecter I dans la partie else *)
end;

procedure TryStatement;
var
  I: Integer;
begin
  I := 0;
  try
    I := 42;
  except
    Writeln('Should not get here!');
  end;
  Writeln(I);        (* Doit affecter I avant le try *)
end;

begin
  B := False;
end.

La solution est d'ajouter des affectations aux chemins de code où elles sont manquantes ou d'ajouter une affectation avant une instruction conditionnelle ou une construction try-except.