関数

提供: AB開発Wiki
ナビゲーションに移動検索に移動
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Functionステートメント

戻り値を有する関数を定義します。

Function [Export] [cdecl] name ([arglist]) [As type]
    [statements]
End Function

項目

Export

DLLをコンパイルする際に関数をエクスポートするかどうかを指定できます。Export修飾子を指定すると関数はエクスポートされ、外部の実行ファイルから参照できます。

cdecl

呼び出し規約がcdeclの関数を定義する際に指定します。cdecl修飾子を指定しない場合はstdcall(デフォルト)になります。

name

関数名を指定します。

arglist

パラメータを指定します。複数のパラメータが存在するときは、各パラメータ同士をカンマ "," で区切って指定します。

As type

後に戻り値のデータ型を指定します。

statements

関数の処理内容を単行、または複数行に渡って記述します。

戻り値の指定

戻り値を有するFunctionステートメントでは、戻り値を返すためのコードを下記のように記載する必要があります。

Function TestProc() As Long
    '10を返す
    TestProc=10
    Exit Function
End Function
Function TestProc() As Long
    '10を返す
    Return 10
End Function

これらのコードはいずれも同じ動作になります。Exit Functionステートメントは関数を抜け出すための命令です(事前に戻り値を指定しておく必要があります)。Returnステートメントは戻り値を指定し、尚且つ関数を抜け出します。関数名を修正したときなどに修正箇所が軽減できることから、後者のReturnステートメントを利用する方法を推奨いたします。

"End Function" の手前に "Exit Function" または "Return" が指定されていないときは関数は自動的に終了し、呼び出し元に処理を移します。


Subステートメント

戻り値が無い関数を定義します。

Sub [Export] [cdecl] name ([arglist])
    [statements]
End Sub

項目

戻り値を指定しないポイント以外はFunctionステートメントと同様です。

関数から抜け出す場合

関数を処理中に "Exit Sub" または "Return" が実行されるとその関数は終了し、呼び出し元に処理を移します。

オーバーロード

オーバーロードとは、パラメータや戻り値のデータ型が異なる同名の関数を多重に定義することを言います。

#prompt
Sub TestProc(a As Long)
    Print "パラメータは整数型です"
End Sub

Sub TestProc(a As Double)
    Print "パラメータは実数型です"
End Sub

Sub TestProc(a As String)
    Print "パラメータはString型です"
End Sub

TestProc(10)
TestProc(3.14)
TestProc("Hello")

上記のソースコードは同一名のTestProc関数を異なる三つのパラメータで定義しています。実行結果は下記のようになります。

パラメータは整数型です
パラメータは実数型です
パラメータはString型です


関数ポインタ

関数エントリポイントを指し示すデータの型を関数ポインタ型といいます。関数ポインタ型は、一般のポインタ型と同様、ポインタ値の変更や読み取りを行えます。それと同時に、そのポインタデータが指し示す関数を実行することができます。

関数ポインタを定義するには、通常の変数と同様、Dimステートメントを利用します。型には、戻り値が必要なときは*Functionを、不必要なときは*Subを指定します。

Dim pFunc As *Function(a As Long, b As Long) As Long
Dim pSub As *Sub(a As Long, b As Long)

TypeDefステートメントを利用し、あらかじめ関数ポインタ型を定義しておくとコードが読みやすくなります。

TypeDef PFUNC = *Function(a As Long, b As Long) As Long
TypeDef PSUB = *Sub(a As Long, b As Long)
Dim pFunc As PFUNC
Dim pSub As PSUB

呼び出し方法は一般の関数と同様です。

Dim ret As Long
ret=pFunc(1,2)
pSub(10,20)

関数のエントリポイントの取得にはAddressOf関数を利用します。AddressOf関数は左辺値(代入先)の関数ポインタ型を識別し、オーバーロードを解決することができます。

#prompt

Sub TestProc(a As Long)
	Print "パラメータは整数型です"
End Sub
Sub TestProc(a As String)
	Print "パラメータはString型です"
End Sub

'関数ポインタ型を定義
TypeDef PTESTPROC_LONG = *Sub(a As Long)
TypeDef PTESTPROC_STR = *Sub(a As String)

'関数ポインタを定義
Dim pProc1 As PTESTPROC_LONG
Dim pProc2 As PTESTPROC_STR

'関数のエントリポイントを代入(オーバーロードに対応)
pProc1=AddressOf(TestProc)
pProc2=AddressOf(TestProc)

'呼び出し
pProc1(10)
pProc2("abc")