Parameters/ja

From Lazarus wiki
Jump to: navigation, search

English (en) español (es) français (fr) 日本語 (ja) 中文(中国大陆)‎ (zh_CN)

4B - 引数 (著者: Tao Yue, 状態: 原文のまま修正なし)

引数リスト(parameter list)は手続きのヘッディングの部分として含まれる。引数リストは変数値をメインのプログラムから手続きへと引き渡すことを可能にする。新しい手続きのヘッディングは次のようになる。

手続き名 (仮引数リスト);

引数リストが複数の引数グループから成っているときは、セミコロンで区切る。

引数グループ1; 引数グループ2; ... ; 引数グループn

各引数グループは以下の形式をとる。

識別子1, 識別子2, ... , 識別子n : データ型

手続きは仮引数リスト(formal parameter list)と同じ数で同じタイプの実引数(actual argument)を受け渡すことで呼び出される。

procedure Name (a, b : integer; c, d : real);
begin
  a := 10;
  b := 2;
  writeln (a, b, c, d)
end;

上記の手続きをメインのプログラムから、以下のように呼んだとしよう。

alpha := 30;
Name (alpha, 3, 4, 5);

メインのプログラムに戻ったとき、alpha の値は何だろう? 答えは30。だが、alpha は a に渡され、それには10が割り当てられていたはずである。実際には a と alpha は完全に区別される。メインのプログラムでの値は手続きで起きたことには影響されないのである。

これは値渡し(call-by-value)と呼ばれる。これは変数のを手続きに渡す。

パラメータを渡すもう一つの方法は参照渡し(call-by-reference)と呼ばれる。これは仮パラメータと実パラメータの間にリンクを作り出す。仮パラメータが手続き内で変更されると、実パラメータも同様に変更される。参照渡しはパラメータ・グループの前に VAR をつけると利用できる。

VAR 識別子1, 識別子2, ..., 識別子n : データ型;

この場合、定数と値そのもの(literals)は実パラメータとして利用できない。それらは手続き内で変化させることができないからである。

ここでは値渡し参照渡しを混ぜた例を示そう。

procedure Name (a, b : integer; VAR c, d : integer);
begin
  c := 3;
  a := 5
end;
 
begin
  alpha := 1;
  gamma := 50;
  delta := 30;
  Name (alpha, 2, gamma, delta);
end.

手続きが開始されるとすぐに gamma は 3 という値をとる。なぜなら c は参照パラメータだからである。しかし、 alpha はまだ 1 のままである。 a は値パラメータだからである。

これはちょっと混乱を招くかもしれない。値渡しは変数をコピーし、それからそのコピーを手続きに与えるものと考えるとよい。手続きはそのコピーで仕事をして、終わるとそれを捨てる。オリジナルは変わらないままである。

参照渡しは実際の変数を手続きに渡す。手続きはその変数で直接に作業し、それをメインのプログラムに返す。

言い換えると値渡しはメインのプログラムから手続きへの一方向のデータ転送である。参照渡しは両方向の転送である。

previous contents next