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

Delphi 将无限数量的参数传递给过程,delphi,parameters,delphi-2009,Delphi,Parameters,Delphi 2009,在Delphi中,程序write可以处理: write(TF,st1) 及 我想声明一个也可以这样做的过程,语法是什么 以及选择: write(TF,[st1,st2,st3]) 虽然我知道怎么做,但不太可取 主要目的是将ShortStrings传递到函数中,该函数将从文件中进行读取调用,并按照定义的ShortString长度进行读取。然而,在将其作为变量或在开放数组中传递后,shortString将失去其“大小”并变为255,这使得我无法使用此传递。 但是如果你想通过开放数组,答案仍然是肯

在Delphi中,程序write可以处理:

write(TF,st1)

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

以及选择:

write(TF,[st1,st2,st3])
虽然我知道怎么做,但不太可取

主要目的是将
ShortString
s传递到函数中,该函数将从文件中进行读取调用,并按照定义的
ShortString
长度进行读取。然而,在将其作为变量或在开放数组中传递后,
shortString
将失去其“大小”并变为255,这使得我无法使用此传递。
但是如果你想通过开放数组,答案仍然是肯定的。

首先
Inc
Write
都是不好的例子,因为它们都得到了编译器的特殊处理。您不能编写一个与这两个函数的行为完全相同的函数。你应该调查一些替代方案

看看重载 您可以使用不同数量的参数和不同类型创建方法的多个版本。大概是这样的:

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;
MyInc(i, []); // no parameters
MyInc(i, [1]);
MyInc(i, [1, 34, 43, 12]);
如果所需的过载数量不太大,这是可行的。编译器可能很容易处理很多重载,但您可能不想编写它们。当过载数量出现问题时,可以切换到阵列:

使用开放数组作为参数 一个函数可以接受您类型的数组类型的参数,当您调用该函数时,您可以根据需要传递任意多的参数:

procedure MyInc(var i:Integer; Vals: array of Integer);
然后像这样使用它:

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;
MyInc(i, []); // no parameters
MyInc(i, [1]);
MyInc(i, [1, 34, 43, 12]);

仅供说明之用:

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;

Barry Kelly对

的回答中可以找到更详细的解释,以补充Cosmin的回答:如果参数列表的类型不同,可以使用一个可变的开放数组参数(也称为“常数数组”)

示例(来自):


真正地你不能自己查这个?嗯
inc
不支持可变数量的参数。@它也支持-可以用一个或两个参数调用它:
inc(x)
Inc(x,y)但不是像OP写的那样具有无限数量的参数…不,
Inc
无法处理无限数量的参数parameters@ROMANARMY这确实回答了问题:如何创建过程写入(TF[st1,st2,st3]);这不是问题所在。