プロシージャと関数
プロシージャと関数こそは、プログラム構造の中心的な役割を担うものです。これらを利用することで、複雑なプログラムを個々のタスクごとにブロック化することができます。
プロシージャ
プロシージャは、プログラム内の特定の処理を実行するユニットのことですが、戻り値を返すことはありません。構文は次のようになります。
Sub Test ' ... here is the actual code of the procedure End Sub
このサンプルコードでは Test という名前のプロシージャを定義していますが、このプロシージャによる処理は、プログラム内の任意の位置から実行させることができます。プロシージャを呼び出すには、次のようにプログラム内の該当行にプロシージャ名を記述するだけです。
関数
関数も、プロシージャと同様に、特定のプログラムブロックを 1 つのユニットとしてまとめたものです。プロシージャとの相違点として、関数は戻り値を返すという点があります。
Function Test ' ... here is the actual code of the function Test = 123 End Function
戻り値は、簡単な代入を使用して割り当てます。この代入は、関数の末尾で実行する必要はなく、関数内の任意の位置で行えます。
上記のようにして定義した関数は、プログラム内の任意の位置から呼び出すことができます。
Dim A A = Test
このコードは、変数 A を宣言してから、関数 Test の戻り値をその中に代入しています。
戻り値として返す値は、関数内で何回も書き換えることが可能です。通常の変数への代入操作と同様に、次のサンプルでも実際に返される関数の戻り値は、最後に代入した値となります。
Function Test Test = 12 ' ... Test = 123 End Function
このサンプルコードの場合、関数の戻り値は 123 となります。
戻り値の代入を行わなかった場合、その関数からは zero 値が返されます (数値関数の場合は 0 、文字列関数の場合は空白文字列)。
関数の戻り値のデータ型は、任意の種類を指定できます。この場合のデータ型宣言は、通常の変数宣言と同様の手順で行えます。
Function Test As Integer ' ... here is the actual code of the function End Function
プロシージャと関数の強制終了
Apache OpenOffice Basic では、Exit Sub および Exit Function コマンドを使用して、実行途中のプロシージャや関数を強制終了させることができ、エラーの処理などに便利です。これらのコマンドは、プロシージャや関数を強制終了させてから、これらを呼び出した行にまでプログラムの実行行を戻します。
次のサンプルコードでは、変数 ErrorOccured の値が True になった場合に、プロシージャを強制終了します。
Sub Test Dim ErrorOccured As Boolean ' ... If ErrorOccured Then Exit Sub End If ' ... End Sub
パラメータの渡し方
関数やプロシージャには、1 つまたは複数のパラメータ (引数) を渡すことができます。パラメータは、関数やプロシージャの名前の後に、かっこで囲んで指定する必要があります。次の例では、整数値 A と文字列 B をパラメータとして予想するプロシージャを定義しています。
Sub Test (A As Integer, B As String) ' ... End Sub
通常、Apache OpenOffice Basic では、パラメータの渡し方は参照 です。この場合、呼び出したプロシージャや関数が終了しても、これらの変数値に対して行われた変更はそのまま維持されます。
Sub Test Dim A As Integer A = 10 ChangeValue(A) ' The parameter A now has the value 20 End Sub Sub ChangeValue(TheValue As Integer) TheValue = 20 End Sub
この例では、値 A は Test 関数で定義されており、それがパラメータとして ChangeValue 関数に渡されます。その後、値は 20 に変更されて TheValue に渡されますが、これは関数が終了しても維持されます。
またパラメータに対する変更をオリジナルの変数の内容に反映させたくない場合は、パラメータを値渡しで与えることも可能です。パラメータを値で渡すよう指定するには、関数ヘッダで変数宣言の前にキーワード ByVal を指定する必要があります。
前の例では、関数 ChangeValue を置き換えた場合、上位の変数 A はこの変更による影響を受けません。関数 ChangeValue を呼び出した後も、変数 A の値は 10 のままです。
Sub ChangeValue(ByVal TheValue As Integer) TheValue = 20 End Sub
オプションパラメータ
関数やプロシージャを呼び出す際には、必要なパラメータをすべて指定する必要があります。
Apache OpenOffice Basic では、パラメータをオプションとして定義できます。つまり、対応する値が呼び出しに含まれない場合、Apache OpenOffice Basic は空のパラメータを渡します。次の例では、パラメータ A は必須ですが、パラメータ B はオプションです。
Sub Test(A As Integer, Optional B As Integer) ' ... End Sub
IsMissing 関数を使うと、呼び出し時にパラメータが指定されているかをチェックできます。
Sub Test(A As Integer, Optional B As Integer) Dim B_Local As Integer ' Check whether B parameter is actually present If Not IsMissing (B) Then B_Local = B ' B parameter present Else B_Local = 0 ' B parameter missing -> default value 0 End If ' ... Start the actual function End Sub
上記のサンプルコードでは、まずパラメータ B に値が指定されているかをチェックしてから、チェック結果に応じて、局所変数 B_Local に渡す値を変えています。対応するパラメータが存在しない場合、B_Local には、渡されたパラメータではなく、デフォルト値 (この例では 0) が代入されます。
再帰処理
再帰処理とは、関数やプロシージャが処理中に自分自身を呼び出すことで、特定の終了条件を満たすまで、このような処理を実行し続けます。たとえば再帰関数の場合、終了条件が満たされた段階で、戻り値を返します。
次のサンプルコードは再帰関数の使用例で、42、-42、3.14 の各数値の階乗を再帰処理で求めています。
Sub Main Msgbox CalculateFactorial( 42 ) ' Displays 1,40500611775288E+51 Msgbox CalculateFactorial( -42 ) ' Displays "Invalid number for factorial!" Msgbox CalculateFactorial( 3.14 ) ' Displays "Invalid number for factorial!" End Sub Function CalculateFactorial( Number ) If Number < 0 Or Number <> Int( Number ) Then CalculateFactorial = "Invalid number for factorial!" ElseIf Number = 0 Then CalculateFactorial = 1 Else ' This is the recursive call: CalculateFactorial = Number * CalculateFactorial( Number - 1 ) Endif End Function
上記のサンプルコードでは、数値 42 の階乗を計算する際に、関数 CalculateFactorial を再帰的に呼び出し、基本条件 0! = 1 になった時点で処理を終了しています。
![]() |
再帰回数のレベルは、ソフトウェアのプラットフォームごとに異なります。Windows の場合、再帰回数のレベルは 5800 です。Solaris および Linux の場合、再帰回数のレベルは、スタックサイズの計算結果を基に計算されます。 |
Content on this page is licensed under the Public Documentation License (PDL). |