Delphi 将无限数量的参数传递给过程
在Delphi中,程序write可以处理:Delphi 将无限数量的参数传递给过程,delphi,parameters,delphi-2009,Delphi,Parameters,Delphi 2009,在Delphi中,程序write可以处理: write(TF,st1) 及 我想声明一个也可以这样做的过程,语法是什么 以及选择: write(TF,[st1,st2,st3]) 虽然我知道怎么做,但不太可取 主要目的是将ShortStrings传递到函数中,该函数将从文件中进行读取调用,并按照定义的ShortString长度进行读取。然而,在将其作为变量或在开放数组中传递后,shortString将失去其“大小”并变为255,这使得我无法使用此传递。 但是如果你想通过开放数组,答案仍然是肯
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函数,因为它涉及到在访问堆栈中的参数时使用一些低级的肮脏技巧 它涉及使用cdecl和varargs修饰符:
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]);这不是问题所在。