[an error occurred while processing this directive] [an error occurred while processing this directive]


プログラミング
逆引き
クライアントとの通信
VisMでの通信
Factoryでの通信
WebServiceでの通信
CSP (Cache' Server Pages)
Cache'SQL
設定・性能


【広告】









引数の渡し方

Parameters.

メソッド・関数へのパラメーターの渡し方には、他の言語と同様に値渡しと参照渡しの2つの方法があります。

値渡し

基本的な値の渡し方です。
Atai(val) Public {
    Write val
}
このプログラムをtest.macという名前で保存したとすると、プログラムは次のように動作します。
USER> Do Atai^test(100)
100
Atai関数に引数100を渡し、実行しました。
Atai関数は渡された引数を変数valに格納し、プログラム中のWrite valの命令で、その内容を書きだします。
この結果、変数valに入っていた100が表示されます。

引数が複数必要な場合は、その数だけ受け取る引数をコンマ区切りで増やしていきます。以下は引数を3つ持つメソッドの例です。
Atai3ko(val1, val2, val3) Public {
    Write val1,!
    Write val2,!
    Write val3,!
}

渡される変数が少ない場合 - デフォルト値の設定

先ほどのAtai3ko関数は引数を3つ受け取りました。このAtai3ko関数に、2つしかパラメータを渡さなかったらどうなるのでしょうか?
USER> Do Atai3ko^test(100,200)
100
200
 Write val3
^
<UNDEFINED>Atai3ko+1^test *val
このように、 プログラムは動作し始め、最初の2つのパラメータ (100と200) は出力していますが、3つ目の変数val3を出力しようとしたところで、<UNDEFINED>エラーが発生してプログラムが止まってしまいます。

この問題を防ぐには、引数にデフォルト値を用意しておく方法があります。
デフォルト値は次のように引数名の後ろに、イコールとデフォルト値 を書くことで使うことができます。
Atai3ko(val1 = 0, val2 = 0, val3 = "ABC") Public {
    Write val1,!
    Write val2,!
    Write val3,!
}
上と同様に実行すると
USER> Do Atai3ko^test(100,200)
100
200
ABC
渡されなかった3つめの引数は、デフォルトのABCが出力されます。

渡される変数が多い場合 - 可変個数の引数

引数を3つ受け取るAtai3ko関数に、今度は4つパラメータを渡したらどうなるのでしょうか?
USER> Do Atai3ko^test(100,200,300,400)
Atai3ko(val1 = 0, val2 = 0, val3 = "ABC") Public {
^
<PARAMETER>Atai3ko^test
<PARAMETER>エラーが発生してしまいます。 

これを動作するようにするには、可変個数の引数を受け取れるようにします。可変個数の引数を受け取るには、変数名の後ろにピリオドを3つ置きます。
Takusan(Args...) Public {
    ZWrite Args
}
これに沢山の引数を渡すと、引数Argsに配列として渡されます。
USER> Do Takusan^test(1,2,3,4,5)
Args=5
Args(1)=1
Args(2)=2
Args(3)=3
Args(4)=4
Args(5)=5
沢山の値を渡す目的であれば、次の参照渡しを使用する方が良いでしょう。

参照渡し

参照渡しは、値渡しと比べると次のような違いがあります。
  • メソッド内で引数を変更すると、メソッド呼び出し元でもその変更が反映される
  • 配列などを渡すことができる
参照渡しは、メソッド呼び出し側で変数名の前にピリオドを置きます。

Sansyou(X) Public {
  X=X+100
}
このようなプログラムがある場合に、引数を値渡しした場合と、参照渡しした場合の動作を比べてみます。
USER>Set X=100

USER>Do Sansyou^test(X) //値渡し

USER>Write X
100

USER>Do Sansyou^test(.X) //参照渡し Xの前にピリオド

USER>Write X
200
値渡しでは実行後も変数 X の値は最初にセットした100のままですが、
参照渡しでは実行後の変数 X の値は、メソッド Sansyou 内で +100された200と変化しています。


Sansyou(X) Public {
  ZWrite X
}
のようにプログラムを修正して、配列が渡されることを確認します。
USER>Set X=3, X(1)=10, X(2)=20, X(3)=30,

USER>Do Sansyou^test(.X) //参照渡し Xの前にピリオド
X=3
X(1)=10
X(2)=20
X(3)=30
このようにメソッド中で配列の値を参照することができます。



[an error occurred while processing this directive] [an error occurred while processing this directive]
2012/11/19Update