这是旧程序员的问题。
多年前,我遇到了一种Pascal方言,通过某种扩展方式允许可变数量的参数。
有没有人知道Pascal的当前方言允许可变数量的参数?
鉴于Pascal并不像以前那样流行,如果答案是否定的,我不会感到惊讶。
BTW, 更正确,不是吗,说参数的可变数量,而不是参数?
答案 0 :(得分:6)
没有。答案是基于我使用的Pascal方言;其他人可能会有所不同。
原因是Pascal按顺序将参数压入堆栈帧,因此所有参数都是通过堆栈指针的固定偏移量访问的。相比之下,C以相反的顺序推送参数,因此定义的参数处于固定偏移量,您可以通过指针算法访问“额外”参数。我会尝试一些ASCII艺术:
Pascal C
---------------------
| extra arg |
--------------------- ---------------------
| 1st param | | 3rd param |
--------------------- ---------------------
| 2nd param | | 2nd param |
--------------------- ---------------------
SP -> | 3rd param | | 1st param |
--------------------- ---------------------
至于参数与参数:当我学习它时,函数(方法)定义其参数,调用者传递参数。我相信,这个定义来自Fortran手册,因此应该让您了解我的年龄: - )
答案 1 :(得分:2)
您可以使用delphi的可选参数来获得相同的效果:
procedure Proc(const A: Integer; const B: Integer = 15);
Proc(10); // B = 15
Proc(20,30);
或重载方法:
procedure Proc(const A: Integer); overload;
procedure Proc(const A,B: Integer); overload;
Proc(10); // Variant 1
Proc(20,30); // Variant 2
或者您可以将变量数组用于参数:
procedure Message(const AMessage: string; const AArgs: array of const);
Message('Hello %s', [Name]);
Message('%s %s', [Greeting, Name]);
答案 2 :(得分:1)
GNU-Pascal(基于gcc)afaik映射1:1到C支持。使用函数(arg:pchar; ...)就像语法
Delphi / Free Pascal有“const数组”支持,这是一个类型安全版本,还有一个用于C接口的varargs指令(D6或D7 +)
答案 3 :(得分:0)
你可能正在考虑一个可用于Turbo Pascal的库,他们有这样的黑客攻击。我的语法对于对象来说有点生疏,并且从它下降。
type
TValue = object;
TInteger = object(TValue)
Value : Integer;
end
TString = object(TValue)
Value : String;
end
TParam = record
Value : TValue;
Param : TParam;
end;
TValue = object;
{ Definition of Function }
function Test (Arg : TParam);
{ Usage }
var
I : TInteger;
S : TString;
Test (TParam (I, TParam (S, nil));
您可以根据需要链接尽可能多的参数。最后一个必须以nil终止。
答案 4 :(得分:0)
是的!
使用 params
关键字:
procedure write(params args: array of Object);
begin
{...}
end;