3

这是程序员的问题。

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

有谁知道当前允许可变数量参数的 Pascal 方言?

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

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

4

5 回答 5

7

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

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

        Pascal                  C

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

至于参数与参数:据我所知,函数(方法)定义其参数,调用者传递参数。我相信,这个定义来自 Fortran 手册,所以这应该让您了解我的年龄:-)

于 2009-09-22T12:33:15.587 回答
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]);
于 2009-09-22T12:31:34.547 回答
1

GNU-Pascal(基于 gcc)afaik 将 1:1 映射到 C 支持。使用函数 something(arg:pchar;...) 之类的语法

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

于 2009-10-05T15:22:00.960 回答
0

您可能正在考虑一个可用于 Turbo Pascal 的库,他们有这样的 hack。我的语法对于对象和继承它有点生疏。

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 终止。

于 2015-06-10T03:24:40.303 回答
0

是的!

使用params关键字:

procedure write(params args: array of Object);
begin
  {...}
end;
于 2020-12-21T11:09:26.087 回答