パラメータ

パラメータとは、関数に引き渡すデータのことをいいます。パラメータのことを「引数」と表現することがありますが、これらは同一の意味となりますので、ご了承ください。

仮引数と実引数

関数呼び出し時に、呼び出し側から指定するパラメータを、実引数と呼びます。実引数には、変数や数式を書くことができます。これに対し、プロシージャ定義行内に記述する引数を仮引数と呼びます。

Sub Test(p As Long) '「p」は仮引数
    〜
End Sub

Dim a As Long
Test(a) '「a」は実引数

各引数の型指定(As 〜)を省略すると型宣言文字が参照されます。複数の引数を扱う場合は引数どうしをカンマ( , )で区切って指定します。

パラメータの参照方法

関数にパラメータを引き渡す際には、パラメータのデータ自体を引き渡すか(値参照)、パラメータが格納されているアドレスの位置を引き渡すか(ポインタ参照)という2通りの方法があります。

値参照(By Value)

変数名の前の"ByRef" を省略すると、値参照になります。値参照を行うと、仮引数用のメモリが新たに確保され、そこに実引数の値がコピーされます。プロシージャ内で仮引数の内容を変更しても、実引数の変数に影響はありません。同様に、文字列を値参照すると、仮引数の文字列バッファが新たに確保され、そこに実引数の文字列バッファの内容がすべてコピーされます。配列、構造体を値参照することはできません。

#N88BASIC

'例
Sub Test(p As Long)
    p=20
End Sub

Dim a As Long
a=10
Test(a)
Print a '10と表示される

ポインタ参照(By Reference)

ポインタ参照の引数を定義するときは、変数名の前に "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)