H2077 Valeur affectée à '%s' jamais utilisée (Delphi)

De RAD Studio
Aller à : navigation, rechercher

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

Le compilateur donne ce message d'information si la valeur affectée à une variable n'est pas utilisée. Si l'optimisation est activée, l'affectation est éliminée.

Ceci peut se produire soit parce que la variable n'est plus utilisée, soit parce qu'elle est réaffectée avant d'être utilisée.


program Produce;
(*$HINTS ON*)

procedure Simple;
var
  I: Integer;
begin
  I := 42;                 (*<-- Message d'information ici*)
end;

procedure Propagate;
var
  I: Integer;
  K : Integer;
begin
  I := 0;                 (*<-- Message d'information ici*)
  Inc(I);             (*<-- Message d'information ici*)
  K := 42;
  while K > 0 do begin
    if Odd(K) then
      Inc(I);             (*<-- Message d'information ici*)
    Dec(K);
  end;
end;

procedure TryFinally;
var
  I: Integer;
begin
  I := 0;                 (*<-- Message d'information ici*)
  try
    I := 42;
  finally
    Writeln('finally atteint');
  end;
  Writeln(I);             (*Ecrira toujours 42 - si une exception est émise,
          nous ne l'obtiendrons pas ici*)
end;

begin
end.

Dans la procédure Propagate, le compilateur est assez intelligent pour réaliser que comme la variable I n'est pas utilisée après la boucle while, elle n'a pas besoin d'être incrémentée dans le while, et par conséquent l'incrément et l'affectation avant la boucle while sont aussi superflus.

Dans la procédure TryFinally, l'affectation sur I avant la construction try-finally n'est pas nécessaire. Si une exception se produit, nous n'exécutons pas l'instruction Writeln à la fin, afin que la valeur de I n'ait aucune importance. Si aucune exception n'est émise, la valeur de I vue par l'instruction WriteIn est toujours 42. Ainsi la première affectation ne changera pas le comportement de la procédure, et peut par conséquent être éliminée.

Ce message d'information n'indique pas que votre programme est faux - cela signifie seulement que le compilateur a déterminé qu'il y a une affectation non nécessaire.

Vous pouvez normalement supprimer cette affectation (elle sera éliminée dans le code compilé de toute manière si vous compilez avec les optimisations activées).

Parfois, cependant, le vrai problème est que vous avez fait une affectation sur une mauvaise variable, par exemple en voulant faire une affectation sur J mais vous l'avez faite sur I. Ainsi il est préférable de vérifier l'affectation en question attentivement.