将TStack代码从Delphi转换为Lazarus

时间:2016-03-09 20:26:34

标签: delphi pascal lazarus

在Delphi中,我有以下代码,一切正常:

var
  StackOptions:TStack<String>;
  s:string;
  bfisio:boolean;
begin
  StackOptions:=TStack<String>.Create;
  //some pushs here 
  for s in StackOptions do begin
    dosomething;
  end;
end;

在拉撒路我可以这样做:

uses
  ..., gstack;

type
  TStringStack = specialize TStack<String>;

var
  StackOptions: TStringStack;
  s:string;
begin
  //But this code doesn;t compile
  StackOptions := TStringStack.Create;
  //some pushs here 
  for s in StackOptions do begin // <-- Error 
    dosomething;
  end;
end;

我在Lazarus中遇到了下一个错误:

  

编译项目,目标:TicketLaz.exe:退出代码1,错误:1
  umain.pas(263,12)错误:找不到“TStack $ 1 $ crcAC3AF268”类型的枚举器

如何循环堆栈并使用Lazarus搜索值而不从Stack中删除项目?

1 个答案:

答案 0 :(得分:2)

FPC的筹码由TVector支持 TVector有一个普查员。

您可以轻松添加类帮助器,如下所示:
快速而脏的代码。

type
  TStringStack = specialize TStack<String>;

 type

   { TStackHelper }

   TVectorEnumerator = specialize TVector<string>.TVectorEnumerator;

   TStackHelper = class helper for TStringStack
     function GetEnumerator: TVectorEnumerator;
   end;

{ TStackHelper }

function TStackHelper.GetEnumerator: TVectorEnumerator;
begin
  Result:= FData.GetEnumerator;
end;

我真的不明白为什么堆栈不应该有迭代器 即使在装配中,你也可以做mov reg,[esp-04] 这种数据结构的清教徒方法有助于没有人

TStack是通用的,这一切都很复杂 我知道FPC允许通用的类助手,但我不确定如何使解决方案适用于所有TStack<T>

另一种方法是简单地编辑gstack.pas以暴露迭代器。