関数

提供: AB開発Wiki
2007年8月6日 (月) 02:30時点におけるEgtra (トーク | 投稿記録)による版 (+Category:言語仕様)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動検索に移動

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")