2009-09-22 65 views
2

这是较旧的程序员的问题。Pascal的任何方言是否允许可变数量的参数?

几年前,我遇到了一种帕斯卡方言,它通过某种扩展方式允许可变数量的参数。

有谁知道帕斯卡尔当前的方言,它允许可变数量的参数?

鉴于Pascal不像以前那么受欢迎,如果答案是否定的,我不会感到惊讶。

顺便说一句,这是正确的,是不是,说了可变数量的参数,而不是参数

+1

是的,说更多的参数变量是正确的,函数只能有一个参数,它是一个变量列表的参数,通常作为最后一个参数 – 2009-09-22 12:33:23

+0

我喜欢这种思考方式:'一个参数是一个可变的参数列表'+1(但你不是真的*够老*; -D) – pavium 2009-09-22 13:06:15

回答

6

不可以。答案是基于我用过的帕斯卡方言;其他人可能会不同。

原因是Pascal按顺序将参数压入堆栈帧,因此所有参数都是通过堆栈指针的固定偏移量访问的。 C通过比较以相反的顺序推入参数,所以定义的参数处于固定偏移量,并且可以通过指针算术访问“额外”参数。我会尝试一些ASCII艺术:

 Pascal     C 

           --------------------- 
           |  extra arg  | 
     --------------------- --------------------- 
     |  1st param  | |  3rd param  | 
     --------------------- --------------------- 
     |  2nd param  | |  2nd param  | 
     --------------------- --------------------- 
SP -> |  3rd param  | |  1st param  | 
     --------------------- --------------------- 

至于参数与参数:我学过的函数(方法)定义了它的参数,调用者传递的参数。我相信这个定义来自Fortran手册,所以应该给你一个我多大的想法:-)

+0

谢谢,我会看看我能否找到Apollo DOMAIN Pascal的内部描述,这是允许变量列表参数的方言(以及我仍*使用的)。你的解释有关于它的真相。 – pavium 2009-09-22 13:10:59

+0

如果您仍在使用它,您应该能够使用不同的调用顺序对一个示例进行反汇编。如果他们使用C调用约定,我不会感到惊讶。 – kdgregory 2009-09-22 13:18:50

+0

对于Apollo文档,请参阅:http://bitsavers.trailing-edge.com/pdf/apollo/ – 2013-02-23 02:29:18

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]); 
+1

太好了,我只是让自己变老了;-)。 – 2009-09-22 12:32:02

+0

它看起来像你在第二个例子中显式构造数组,对吗? – kdgregory 2009-09-22 12:34:35

+0

@Gamecat,我会把它放到你30年的经验,尽管* age *没有错。谢谢。 – pavium 2009-09-22 13:15:56

1

GNU-Pascal(gcc based)afaik映射1:1到C的支持。使用函数something(arg:pchar; ...)like syntax

Delphi/Free Pascal具有“array of const”支持,这是一个类型安全的版本,以及用于C接口(D6或D7 +)的可变参数指令

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)); 

您可以根据需要链接尽可能多的参数。最后一个必须以零结尾。