FreeBASIC Function
値を返す手続きを、定義します。
構文:
パラメタ:
identifier: 関数の名前
external_identifier: 引用符で囲んだ、外部的に見える(リンカへの)名前
parameter_list:
parameter[, parameter[, ...]]
parameter:
[ByRef|ByVal] identifier [As type] [= default_value]
identifier: 関数で参照する変数の名前
引数が配列の場合は、空の丸カッコを、識別子の後ろに付けなければなりません
type: 変数の型
default_value: 呼び出しで、引数が何も指定されていない場合に使う値(default_value は、リテラル、定数、または共有変数にすることができます。)
return_type: 関数によって返される変数の型
statements: 関数の本体を構成する、1つ以上の命令文
return_value: 関数から戻る値
記述:
関数は、コードのブロック(複数行の命令文の塊)を定義します。
このコードのブロックは、関数名を使って、単一の命令文(関数呼び出し)で実行することができます。
そして、コードの実行終了時に、関数の呼び出し先に、値(戻り値)を提供することができます。
関数を使うと良い理由は、いつくかあります:
- プログラムの冗長性を減らします。
- 複数のプログラムで、コードを再利用できます。
- プログラムを、読み易くします。
- プログラムを、保守し易くします。
- プログラムを、拡張しやすくします。
アクセス権 :
予約語
Public と
Private は、それぞれ、公開の、または、非公開なイントラ・モジュール・レベルの、アクセス権を指定します。
どちらも指定しないと、関数は、デフォルトで、公開アクセス権(
Public )になります。
呼び出し規則 :
関数呼び出しの間に、引数をスタックに格納して、取り出すときの、呼び出し規則や、順番を指定するために、
CDecl、
Pascal、
StdCall 予約語を使います。
なにも指定しないと、関数は、デフォルトで、標準規則 (
StdCall) を使います。
引数の受渡し :
関数は、呼ばれたときに、一つか複数の、変数または引数を、受け取ります。
これらの引数は、
parameter_list の中に、
parameters として、記載されます。
ByRef と
ByVal 予約語は、引数が、それぞれ、参照か、値か、どちらで渡されるかを、指定します。
引数の型は、
parameter につづく、 "
As type" によって与えます。
宣言で、パラメタにデフォルト値を与える場合は、パラメタは任意です。
配列パラメタは、識別子に、空の丸括弧を続けることで、指定します。
配列パラメタは、いつも ByRef です。
ByRef 予約語は、配列パラメータのために必要なく、また許容もされていないことに注意してください。
配列引数で関数を呼ぶときも、丸括弧を付けなければなりません。
下の例を参照ください。
多重定義された関数 :
多重定義された関数は、別の異なるサインのものと、同じ名前(
identifier)を共有することができます。
Overload 予約語は、関数が、多重定義されていることを明示します。
関数は、関数を多重定義するのに先立って、
Overload 予約語を使って、定義するか、宣言しなければなりません。
戻り値 :
return_type は、終了時に関数によって返される
Data Type を指定します。
データ型を指定しないと、関数はデフォルトのデータ型を返します。デフォルト・データ型は、
DefSng,
DefDbl,
DefStr などを使って別のデータ型に設定されていない限り、Integer になります。
関数は、次の 3つの方法で値を返すことができます。
Return キーワードの後ろに値を指定すると、関数を直ちに終了して、その値を呼び出し元に返します。
関数は、Function キーワードまたは関数の
identifier を、目的の戻り値に代入することで値を返すこともできます(ただし、Function キーワードまたは関数の
identifier では、現在代入されている値を評価することはできません)。
ただし、この 2つの方法では、関数は終了しません。
構築子を持つオブジェクトを返す場合、同じ関数内で、
Return キーワードを、Function= keyword または関数の
identifier= や
Exit Function キーワードと組み合わせることは、サポートされていません。
関数は値を返すので、関数の呼び出しは、式として評価されます。したがって、
assignments や
If 命令文など、式が期待される場所であればどこでも関数を呼び出すことができます。関数は、
ByRef As return_type を指定して、参照を返すこともできます。
警告: どのような出力分岐を使う場合でも、戻り値は常に定義する必要があります。そうしないと、予期しない動作が発生する可能性があります。
局所変数保存 :
Static 予約語は、関数で局所的に宣言された変数が、関数呼び出しの間で保持されることを指定します。
Static で定義された関数に入ると、局所変数はその関数が最後に呼び出されたときと同じ値になります。
グローバル変数アクセス:
関数本体の外側でグローバル変数として定義された重複するシンボルにアクセスするには、プレフィックスとして 1つまたはできれば 2つの点を追加します:.
.SomeSymbol またはできれば
..SomeSymbol (
With..End Withブロック内の場合は
..SomeSymbol のみ)。
関数を呼び出すとき、引数リスト(存在する場合)を囲む括弧は、式の中で関数を呼び出すときだけ必要です。
渡す引数がない場合、括弧はオプションになりますが、関数呼び出しを表すために、関数名の後に空の括弧 '()' を付けるのが一般的な規則です。
64-bit コンパイラだけの警告:
ユーザー手続きの識別子名の選択については、
識別子規則 のページを参照してください。(特に「プラットフォームの違い」の段落)
例:
'' このプログラムは、関数の宣言を示します。
'' そして、Return 命令を使って、値を返します。
Declare Function ReturnTen () As Integer
Print ReturnTen () '' ReturnTen は、デフォルトで整数を返します。
Sleep
Function ReturnTen() As Integer
Return 10
End Function
'' このプログラムは、関数の宣言を示します。
'' そして、関数名への代入を使って、値を返します。
Declare Function ReturnTen () As Integer
Print ReturnTen () '' ReturnTen は、デフォルトで整数を返します。
Sleep
Function ReturnTen() As Integer
ReturnTen = 10
End Function
'' このプログラムは、関数の多重定義を示します。
'' 多重定義された関数は、FIRST になります。
Declare Function ReturnTen Overload (a As Single) As Integer
Declare Function ReturnTen Overload (a As String) As Integer
Declare Function ReturnTen (a As Integer) As Integer
Print ReturnTen (10.000!) ''ReturnTen は、シングルを取って、整数を返します。
Print ReturnTen (10) '' ReturnTen は、整数を取って、整数を返します。
Print ReturnTen ("10") '' ReturnTen は、文字列を取って、整数を返します。
Sleep
Function ReturnTen Overload (a As Single) As Integer
Return Int(a)
End Function
Function ReturnTen Overload (a As String) As Integer
Return Val(a)
End Function
Function ReturnTen (a As Integer) As Integer
Return a
End Function
'' 下の例は、任意パラメータを示します。
Function TestFunc(P As String = "デフォルト") As String
Return P
End Function
Print TestFunc("Testing:")
Print TestFunc
Print TestFunc
("テスト2:")
Sleep
'' この例は、配列引数を取る関数を宣言して、
'' 呼び出す方法を、示しています。
Function x(b() As Double) As Integer
x = UBound(b)-LBound(b)+1
End Function
Dim a(1 To 10) As Double
Print x(a())
Dim c(10 To 20) As Double
Print x(c())
Sleep
方言差:
QBからの違い:
- パラメタは、FreeBASIC で、任意です。
- QBASIC では、戻り値の型は、AS TYPE で指定するのではなく、接尾語で指定できるだけでした。関数は、内蔵型を返すことだけが許されていました。
- 現在、戻り値は、Return 命令文で指定できます。
- 関数 Overload は、FreeBASIC でサポートされます。
- 関数の戻り値は、関数を呼ぶコードで、無視できます。
参照:
ページ歴史:2023-08-30 09:25:02
日本語翻訳:WATANABE Makoto、原文著作者:SysOp