「関数」の版間の差分
編集の要約なし |
細 (+Category:言語仕様) |
||
(2人の利用者による、間の3版が非表示) | |||
46行目: | 46行目: | ||
== Subステートメント == | == Subステートメント == | ||
戻り値が無い関数を定義します。 | 戻り値が無い関数を定義します。 | ||
''' | '''Sub''' ['''Export'''] ['''cdecl'''] ''name'' ([''arglist'']) | ||
[''statements''] | [''statements''] | ||
'''End | '''End Sub''' | ||
=== 項目 === | === 項目 === | ||
55行目: | 55行目: | ||
=== 関数から抜け出す場合 === | === 関数から抜け出す場合 === | ||
関数を処理中に "Exit Sub" または "Return" が実行されるとその関数は終了し、呼び出し元に処理を移します。 | 関数を処理中に "Exit Sub" または "Return" が実行されるとその関数は終了し、呼び出し元に処理を移します。 | ||
== オーバーロード == | == オーバーロード == | ||
85行目: | 84行目: | ||
== 関数ポインタ == | == 関数ポインタ == | ||
関数エントリポイントを指し示すデータの型を関数ポインタ型といいます。関数ポインタ型は、一般のポインタ型と同様、ポインタ値の変更や読み取りを行えます。それと同時に、そのポインタデータが指し示す関数を実行することができます。 | |||
関数ポインタを定義するには、通常の変数と同様、[[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") | |||
[[Category:言語仕様|かんすう]] |
2007年8月6日 (月) 02:30時点における最新版
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")