当前位置:  开发笔记 > 后端 > 正文

将无限数量的参数传递给过程

如何解决《将无限数量的参数传递给过程》经验,为你挑选了3个好方法。

在Delphi中,程序写入可以处理:

write(TF,st1)

write(TF,st1,st2,st3,st4);

我想声明一个也可以这样做的程序,语法是什么?

和选项:

write(TF,[st1,st2,st3])

虽然我知道如何做到这一点,但是不太可取.

主要目的是将ShortStrings 传递给函数,它将从文件进行读取调用,并将shortString按照定义的长度读取.然而,在将它作为变体或在开放数组中传递之后,它shortString失去了它的"大小"并变为255,这使得这个传递对我来说无法使用.但如果你想传递开放数组,答案仍然存在.



1> Fabricio Ara..:

只是为了补充Cosmin的答案:如果参数列表的类型不同,您可以使用变量开放数组参数(也称为"const of array").有关Delphi文档的更多信息.

示例(来自文档):

function MakeStr(const Args: array of const): string;
var
  I: Integer;
begin
  Result := '';
  for I := 0 to High(Args) do
     with Args[I] do
        case VType of
            vtInteger:  Result := Result + IntToStr(VInteger);
            vtBoolean:  Result := Result + BoolToStr(VBoolean);
            vtChar:     Result := Result + VChar;
            vtExtended: Result := Result + FloatToStr(VExtended^);
            vtString:   Result := Result + VString^;
            vtPChar:    Result := Result + VPChar;
            vtObject:   Result := Result + VObject.ClassName;
            vtClass:    Result := Result + VClass.ClassName;
            vtAnsiString:  Result := Result + string(VAnsiString);
            vtCurrency:    Result := Result + CurrToStr(VCurrency^);
            vtVariant:     Result := Result + string(VVariant^);
            vtInt64:       Result := Result + IntToStr(VInt64^);
  end;
end;



2> Cosmin Prund..:

首先,IncWrite不好的例子,因为他们都得到编译器特别处理.你不能编写一个与你自己完全相同的函数.你应该调查一些替代方案.

看一下重载

您可以使用不同数量的参数和不同类型创建方法的多个版本.像这样的东西:

procedure MyInc(var i:Integer); overload;
procedyre MyInc(var i:Integer; const N:Integer); overload;
procedure MyInc(var i:Integer; const N1, N2: Integer); overload;
procedure MyInc(var i:Integer; const N1, N2, N3: Integer):overload;

如果所需的过载次数不是那么大,这是可行的.编译器可能很容易处理大量的重载,但你可能不想写它们.当重载次数成为问题时,您可以切换到数组:

使用Open Arrays作为参数

函数可以采用类型的参数array of YourType,当您调用该函数时,您可以传递尽可能多的参数:

procedure MyInc(var i:Integer; Vals: array of Integer);

然后像这样使用它:

MyInc(i, []); // no parameters
MyInc(i, [1]);
MyInc(i, [1, 34, 43, 12]);



3> JRL..:

仅用于ilustrative目的:

Delphi支持一种编写"真实"变量参数函数的方法,但它实际上很麻烦,主要用于使用像printf这样的可变参数声明外部C函数,因为它涉及到一些低级别的脏技巧来访问参数中的参数.堆.

它涉及使用cdeclvarargs修饰符:

procedure MyWrite_; cdecl;
begin
  ... some magic here ...
end;

var
  MyWrite: procedure; cdecl varargs = MyWrite_;

begin
  MyWrite(1);
  MyWrite(1, 2);
  MyWrite(1, 2, 3);
end;

更详细的解释可以从答案中找到巴里·凯利于如何与功能"可变参数"获取栈的内容?

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有