【问题标题】:delphi 7 function result can be undefineddelphi 7函数结果可以是未定义的
【发布时间】:2012-05-17 03:32:27
【问题描述】:

我写了这个函数,它比较字符串,如果匹配则返回 TRUE,如果不匹配则返回 FALSE。

唯一的问题是,当我编译时,我得到一个错误,说结果可能是未定义的。我知道这不是问题,因为在这种特殊情况下只有两种可能的结果,但我是一个完美主义者,我想变得更好。 你们中的任何人都可以启发我吗?

function filterUPC(upc: String): Boolean; 
var
  i, pos1: integer;
  Plano: TStringList;
  upcPlano: String;
begin
  Plano := TStringList.Create;
  if (fmMain.lblPlanook.Visible) and 
     not (fmMain.lblPlanook.Caption = 'INCOMPATIBLE') then
  begin
    Plano.LoadFromFile(fmMain.ebPlano.Text);
    for i := 0 to Plano.Count - 1 do
    begin
      pos1:=AnsiPos(';', Plano[i]);
      upcPlano := AnsiMidStr(Plano[i], pos1 + 1, 12);
      if (upc = upcPlano) then
      begin
        Result := TRUE;
        Break;
      end
      else if (i = Plano.Count - 1) then
      begin
        Result := FALSE;
      end;
    end;
  end
  else
  begin
    Result := FALSE;
  end;
  Plano.Free;
end;

【问题讨论】:

  • 如果你真的想变得更好,你可以从学习正确格式化你的代码开始。能够轻松阅读(并使其他人能够这样做)会产生更好(并且更易于维护)的代码。 :)

标签: delphi delphi-7 undefined


【解决方案1】:

如果Plano 为空,则您的结果未定义。在这种情况下,for 循环永远不会执行,Result 永远不会被设置。

另外,您真的应该将 TStringList create/free 包装在 try/finally 中(因为您是完美主义者;)

我会这样做:

function filterUPC(upc: String): Boolean;
var
  i, pos1: integer;
  Plano: TStringList;
  upcPlano: String;
begin
  Result := FALSE;
  Plano := TStringList.Create;
  try
    if (fmMain.lblPlanook.Visible) and (fmMain.lblPlanook.Caption <> 'INCOMPATIBLE') then
    begin
      Plano.LoadFromFile(fmMain.ebPlano.Text);
      for i := 0 to Plano.Count -1 do
      begin
        pos1 := AnsiPos(';', Plano[i]);
        upcPlano := AnsiMidStr(Plano[i], pos1 + 1, 12);
        if (upc = upcPlano) then
        begin
          Result := TRUE;
          Break;
        end;
      end;
    end
  finally
    Plano.Free;
  end;
end;

我已将Result:=FALSE; 添加到顶部,并删除了else 检查。 try/finally 保证 Plano 将被释放,即使引发异常。

【讨论】:

  • 所以我应该将“and if Plano.Count=0”添加到 else if i=Plano...?你能快速解释一下为什么我应该尝试……最后吗?谢谢!
  • 已编辑。您不能将 Plano.Count=0 添加到 else if,因为它在 for 循环内:如果 for 条件永远不会为真,则该代码将永远不会执行。
  • try..finally 表示无论发生什么情况,finally 中的代码都保证执行。这意味着,如果你在try 之前创建了一些东西并在finally 中释放它,它肯定会被释放;您不会意外忘记或碰到在没有运行 finally 的情况下退出的代码路径。请参阅Writing a finally block 了解更多信息。 (顺便给@Blorgbeard +1。):)
猜你喜欢
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2021-12-13
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
相关资源
最近更新 更多