分配的值从未使用过。 Delphi bug还是代码bug?

时间:2018-01-11 10:20:02

标签: delphi

此代码是我在我的应用程序中使用的第三方组件的一部分。 我正在尝试解决与我的应用程序中的提示相关的所有可能问题。 但我无法理解这一点。 Delphi Compiler标记此代码的第一行以提示"分配给NewState的值从未使用过! 我只是想了解情况

  NewState := STATE_UNCHECKED;   //Value assigned never used?Really?
  while ( Node <> nil ) and ( Node.Parent <> nil ) do
  begin
    Node := Node.Parent.GetFirstChild;
    CheckedCount := 0;
    UnCheckedCount := 0;
    while True do
    begin
     ....
      if ( Node.StateIndex = STATE_PARTCHECKED ) or
         ( ( CheckedCount > 0 ) and ( UnCheckedCount > 0 ) ) then
      begin
        NewState := STATE_PARTCHECKED; ///assign value on condition
        Break;
      end;

      if Node.GetNextSibling = nil then
      begin
        if CheckedCount > 0 then
          NewState := STATE_CHECKED //assign value on condition
        else
          NewState := STATE_UNCHECKED;
        Break;
      end
      else
        Node := Node.GetNextSibling;
    end;
    Node := Node.Parent;
    if Node <> nil then
      SetState( Node,  NewState );
  end;

但是当这两个判断都是假的时候必须使用这个值。我错了吗?

 if ( Node.StateIndex = STATE_PARTCHECKED ) or
             ( ( CheckedCount > 0 ) and ( UnCheckedCount > 0 ) ) then

if Node.GetNextSibling = nil then

更新

答案是正确的。只有在为变量分配新值并覆盖第一个值后,Break Statment才会运行。然后从未使用过赋值。

最小,完整且可验证的例子:

procedure TForm1.btn1Click(Sender: TObject);
Var x,y,z,k:integer;
begin
   X:=1;
   Y:=strtoint(edit1.text);
   Z:=Strtoint(edit2.text);
   K:=Strtoint(edit3.text);
     while true do
     begin
      If Z=y*2 then
      begin
        X:=2;
        Break;
      end;

      If Y=3 then
      begin
        If K=7 then
        begin
        X:=3;
        Break;
        end
        else
        begin
        x:=6;
        Break;
        end;
      end
     end;

    showmessage(inttostr(x));

end;

2 个答案:

答案 0 :(得分:8)

如果您突出显示的语句都为FALSE,则 while True 循环继续。退出此循环的唯一方法是分配NewState值。所以编译器是正确的。

答案 1 :(得分:2)

首先,你误解了“被使用”的概念。在这种情况下,它意味着“ 你似乎认为这意味着“再次引用变量名称”;所以你错误地想到现有的值被覆盖它正在被“使用”。

您显然没有显示所有代码。丢失的代码是否相关?没有看到它,我无法确定。

但是从显示的代码中:第一行中分配的值将被覆盖,而不会在while True循环中读取。即初始分配 从未使用过到此为止。但是,由于条件代码是否已经到达,是否达到这些行是不明确的。

NewState 正如Dsm指出的那样,在 显示的代码中,实现目标的唯一方法是在之后立即突破<{1}}循环 / em> 覆盖初始值。

你没有说你正在使用哪个版本的Delphi,但我不认为旧版本能够解决这个稍微复杂的案例。应该指出的是,编译器无法做出准确判断的情况确实很复杂。但由于此警告涉及编译器从编译输出中删除该行,因此通常仅在逻辑清楚地指示未使用时报告这些情况。