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は、タイプセーフバージョンである「arrayof const」をサポートし、Cインターフェイス(D6またはD7 +)用のvarargsディレクティブを備えています。

于 2009-10-05T15:22:00.960 に答える
0

あなたはおそらく、TurboPascalでこのようなハックがあったライブラリを考えているでしょう。私の構文は、オブジェクトとその子孫に対して少し錆びています。

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 に答える