パラメータとは、関数に引き渡すデータのことをいいます。パラメータのことを「引数」と表現することがありますが、これらは同一の意味となりますので、ご了承ください。
関数呼び出し時に、呼び出し側から指定するパラメータを、実引数と呼びます。実引数には、変数や数式を書くことができます。これに対し、プロシージャ定義行内に記述する引数を仮引数と呼びます。
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)