6.プログラム単位(関数)


6-1 関数プロシージャの宣言

 例えば,三角関数などの数学関数と同様,呼び出されるとユーザが設定した値を返すことのできる関数を作成することができる.これを関数プロシージャと呼び,以下の構文に従って定義する.
  (構文)
 [Public | Private | Friend] [Static] Function関数名 [(仮引数,仮引数,…)] [As型]
   プロシージャ本体
   関数名 = 値
 End Function
 ここで,Public,Private,Friend,Staticは省略可能で以下の意味がある.
Publicすべてのモジュールのすべてのプロシージャから参照を可能にする
Privateプロシージャを記述したモジュール以外からアクセスできないようにする
Friendプロジェクト全体から参照できるがオブジェクトのインスタンスのコントローラからは参照できない
Staticプロシージャ内のローカル変数の値を保持する
 関数名は標準的な変数名の付け方と同じ規則にしたがう.関数プロシージャを呼び出すときに渡す引数のリストは省略可能である.最後に作成した関数プロシージャーから返る値のデータ型を指定する.このデータ型は整数型(Integer)や単精度浮動小数点数型(Single)などの一般的な型である.関数から値を返したい場合は,構文のように関数名に値を代入する.

6-2 関数プロシージャの呼び出し

 先に定義した関数を呼び出す場合は,数学関数の場合と同様に行うことができる.呼び出すときの引数が実引数で,呼び出される側(関数側)の引数が仮引数である.両者の並びに関して,変数名は一致していなくてもよいが,型は一致していなければならない
  (引数の対応関係)
実引数( A,B,C,D )
     ↓ ↓ ↓ ↓
仮引数( B,D,A,C )

プログラム例6-1:度をラジアンに変換する関数を作成する.この例では,引数が一つであるが,複数設ける場合は,引数並びを「,」で区切って記述すればよい. 変換は(180度=πラジアン)の関係を用いて行う.

6-3 配列データの引き渡し

 引数により配列データを関数プロシージャに引き渡す場合,先頭アドレスを渡すことで対応関係を確保している.仮引数は,右の例のように,配列の要素数を指定せず()のみを付ければよい.
  (引数が配列の場合)
仮引数→(配列名() as type, …)

プログラム例6-2:ベクトルの成分を合計するプログラムを作成する.

 このプログラムでは,配列サイズが3であるため,サブルーチンプロシージャ内でのループを3回に限定しているが,どのような配列サイズに対してもこのプロシージャが適用できるようにするためには,この「For 1 To 3」の部分を「For i = 1 To UBound(MatA, 1)」とする.ここで, UBound(MatA,1)は,配列MatAの1次元の上限要素番号を検出している.右の例はプログラム例6-2の汎用性を高めたプログラム例で,UBound(MatA,1)=3である.
 (汎用性を高めた場合)
Function VectSum(MatA() As Integer) As Integer
 Dim i As Integer
 VectSum = 0
 For i = 1 To UBound(MatA, 1)
  VectSum = VectSum + MatA(i)
 Next i
End Function
 配列が2次元になっても基本的な考え方は同じで,仮引数を1次元配列同様に,以下のようにする.
  (引数が2次元配列の場合)
仮引数→(2次元配列名() as type, …)

プログラム例6-3:2次元配列の全配列要素の和を求めるプログラムを作成する.

(注)省略可能な引数
仮引数の前にoptionalが付いている場合,呼び出し時に省略することができる.また,「Optional x As Integer = 1」とした場合,呼び出し時に省略されるとxのデフォルト値が1になる.