【问题标题】:Passing a parameter in a nested function在嵌套函数中传递参数
【发布时间】:2014-02-27 18:32:26
【问题描述】:

我有这个嵌套函数,我想修改 SearchName2 以接收“S”作为参数作为here 中描述的问题的可能解决方案。

我仍在学习 Delphi,不胜感激,我一直在寻找嵌套函数示例,但找不到类似的东西。

PFI = ^TFI;           
TFI = record
    Id         : TToken;
    Name       : TName;
    Parameters : string;
end;

function TListFI.IsIn(S: PChar): PFI;

  function SearchName2(Item: PFI):Boolean;
  var N1, N2: PChar;
  begin
    N1:= StrNew(Item^.Name);
    N2:= StrNew(S);
    SearchName2:= (StrComp(StrUpper(N1), StrUpper(N2)) = 0);
    StrDispose(N1);
    StrDispose(N2);
  end;

begin
  IsIn:= PFI(FirstThat(@SearchName2));
end;

【问题讨论】:

  • 如果您不理解我的回答,那么您应该发表评论要求澄清。我可以给你举个例子。相反,您显然已经独自为此苦苦挣扎了一个多星期。

标签: delphi parameter-passing delphi-xe2 nested-function


【解决方案1】:

Rob Kennedy 在other discussion 中为您提供了解决方案:

使 SearchName2 成为一个有两个参数的函数,然后编写 FirstThat 接受 S 作为参数,它可以将其转发给函数参数。

你需要按照 Rob 告诉你的去做,这就是解决方案,例如:

type
  TFuncionColeccion = function (Elemento: TObject; S: PChar): Boolean;

function TColeccion.FirstThat (Rutina: TFuncionColeccion; S: PChar): TObject;
var
  i: Integer;
begin
  For i:=0 to Count-1 do
    if Rutina(Items[i], S) then
    begin
      FirstThat:=Items[i];
      exit;
    end;
  FirstThat:=nil;
end;

function SearchName2(Item: PFI; S: PChar):Boolean;
var
  N1, N2: PChar;
begin
  N1 := StrNew(Item^.Name);
  N2 := StrNew(S);
  SearchName2 := (StrComp(StrUpper(N1), StrUpper(N2)) = 0);
  StrDispose(N1);
  StrDispose(N2);
end;

function TListFI.IsIn(S: PChar): PFI;
egin
  IsIn := PFI(FirstThat(@SearchName2, S));
end;

话虽如此,您可以完全摆脱StrNew()StrDispose()的使用:

function SearchName2(Item: PFI; S: PChar):Boolean;
begin
  SearchName2 := (StrIComp(Item^.Name, S) = 0);
end;

【讨论】:

  • 我明白必须做什么,但我不知道该怎么做。更我不知道为什么首先会出现问题,因为 S 对于内部函数应该“存在”,显然它不存在。
  • 您没有听 Rob 向您解释内部函数的调用堆栈是如何设置的。您正在绕过编译器正确调用内部函数的能力,因此会产生副作用。
  • @sandiego 不得不重复我们自己是令人沮丧的。请务必仔细阅读您提出问题时得到的答案。再次看到这段代码有点难受,就像一种不会消失的难闻气味。
  • @Remy 如果您避免使用 @ 来获取函数指针,这也会有所帮助。无类型的函数指针首先让我们陷入了这个混乱。
  • @DavidHeffernan: 或turn off untyped pointers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2023-01-30
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
相关资源
最近更新 更多