2009-09-22 64 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)); 

您可以根據需要鏈接儘可能多的參數。最後一個必須以零結尾。