パラメータとは、関数に引き渡すデータのことをいいます。パラメータのことを「引数」と表現することがありますが、これらは同一の意味となりますので、ご了承ください。
関数呼び出し時に、呼び出し側から指定するパラメータを、実引数と呼びます。実引数には、変数や数式を書くことができます。これに対し、プロシージャ定義行内に記述する引数を仮引数と呼びます。
Sub Test(p As Long) '「p」は仮引数 〜 End Sub Dim a As Long Test(a) '「a」は実引数
各引数の型指定(As 〜)を省略すると型宣言文字が参照されます。複数の引数を扱う場合は引数どうしをカンマ( , )で区切って指定します。
関数にパラメータを引き渡す際には、パラメータのデータ自体を引き渡すか(値参照)、パラメータが格納されているアドレスの位置を引き渡すか(ポインタ参照)という2通りの方法があります。
変数名の前の"ByRef" を省略すると、値参照になります。値参照を行うと、仮引数用のメモリが新たに確保され、そこに実引数の値がコピーされます。プロシージャ内で仮引数の内容を変更しても、実引数の変数に影響はありません。同様に、文字列を値参照すると、仮引数の文字列バッファが新たに確保され、そこに実引数の文字列バッファの内容がすべてコピーされます。配列、構造体を値参照することはできません。
#N88BASIC '例 Sub Test(p As Long) p=20 End Sub Dim a As Long a=10 Test(a) Print a '10と表示される
ポインタ参照の引数を定義するときは、変数名の前に "ByRef" を指定します。ポインタ参照を行うと、仮引数のポインタと、実引数のポインタは同じになります。仮引数の内容を変更すると、実引数の内容も変更されることになります。文字列をポインタ参照した場合は、その文字列の先頭ポインタが引き渡されます。
#N88BASIC '例 Sub Test(ByRef p As Long) p=20 End Sub Dim a As Long a=10 Test(a) Print a '20と表示される
ポインタ参照の実引数の前に "ByVal" を指定すると、値参照に切り替えることができます。実引数の値が仮引数のポインタになります。
#N88BASIC '例 Sub Test(ByRef p As Long) p=10 End Sub Dim a As Long, b As Long b=VarPtr(a) Test(ByVal b) Print a '10と表示される
構造体や配列を引数として渡すこともできます。そのような場合はポインタ参照で引き渡すか、ポインタ型データを値参照で引き渡します。一般的には、後者の方法を推奨します。構造体や配列のポインタを取り出し、そのポインタ型データを値参照として引き渡します。下のコードは、構造体のポインタ値を値参照のパラメータで引き渡すプログラムの例です。
#N88BASIC Type NAME_INFO first As String middle As String last As String End Type Sub Test(p As *NAME_INFO) p->first="aaa" p->middle="bbb" p->last="ccc" End Sub Dim a As NAME_INFO Test(VarPtr(a)) Print a.first,a.middle,a.last
下のコードは、配列のポインタ値を値参照のパラメータで引き渡すプログラムの例です。
#N88BASIC Dim a[10] As Long Dim i As Long Sub test(b As *Long) For i=0 to 10 b[i]=i*10 Next End Sub test(a) For i=0 to 10 Print a[i] Next
多次元配列を引き渡すときは、仮引数に配列要素を指定する必要があります。また、下記のようにアドレス参照(ByRef)で配列ポインタを引き渡します。
この引き渡し方法は多次元配列の引き渡しに有効な手段ですが、1次元配列に対しても行えます。
#N88BASIC Dim data[9,9] As Long Sub GetData(ByRef a[9,9] As Long) Dim i As Long, j As Long For j=1 To 9 For i=1 To 9 a[j,i]=i*j Next Next End Sub Sub ShowData(ByRef a[9,9] As Long) Dim i As Long, j As Long For j=1 To 9 For i=1 To 9 Print Using "###";a[j,i]; Next Print Next End Sub '両者の関数ともに、配列ポインタを引数として渡す GetData(data) ShowData(data)