Any 予約語は、型や値の代用語として、いろいろな方法で使われます。
構文:
または
または
または
または
または
または
または
または
記述:
- ポインター (最初の構文):
Any Ptr(または "
Any Pointer")と呼ばれる特別なポインター型は、任意の変数型を指すことができます。
DataType Ptr に型変換すると、インデックスを作成したり、逆参照したりして、
DataType のインスタンスとしてメモリにアクセスできます。
ポインター演算は、
Any Ptr で許可され、
Byte Ptr のように処理されます:ポインターは
1 ずつ増加します。
純粋な
Any Ptr は、コンパイラでチェックされる型を持っていません。
これは、代入するか、パラメータとして渡すことで、暗黙のうちに、他のポインター型へ そして、他のポインター型から、変換されることができます。
Any 単独では、変数としての有効なデータ型でありません。
また、
Any Ptr を間接参照するのは、違法です。(ただし、
Any Ptr Ptr は、
Any Ptr を生成するために、間接参照されることができます。)
これを、
Variant と、混同してはいけません。
Variant は、変数のどんな型も含むことができる Visual Basic のデータ型です。
FreeBASIC は、
Variant 型をネイティブでサポートしません。
- 参照渡しパラメータ (2番目の構文):
Any を、
ByRef パラメーターを持つ、手続き宣言(
Declare 命令文)で使うと、渡された変数の、正しい型のコンパイラー・チェックを無効にすることができます。(これには配列パラメーターを含みます。配列は常に黙示的に参照渡しされるためです。)
ただし、静的手続きの場合を除き、UDT メンバー手続きでは機能しません。
Any のこの用法は非推奨であり、QB との互換性のためにのみ存在します。
- 配列次元 (3番目/4番目の構文):
配列宣言では、
Any は、ある量の次元の動的配列を作成するために、配列境界の代わりに指定することができます。
配列は、指定された
Any の数に基づいて決定される、量の次元になります。
(
Type の中に動的配列メンバーを宣言するときは、
Any の構文を使う必要があります)
パラメータ宣言で、
Any は、また、次元の量を固定するために、空の括弧の代わりに指定できます。
- 初期設定 (5番目/6番目/7番目の構文):
Any を、変数を
0 にデフォルト初期化しなくてよくする、偽(にせ)の初期化子として、使うことができます。
変数は、初期化されていないままになります。
これは、プログラムのきわどい部分で、時間を節約するかもしれません。
変数はデフォルト初期化されていないので、変数を読む前に、プログラムで、この変数に意味があるデータを満たす必要があります。
C/C++ との比較:
これは、C/C++ の、初期化値のない変数宣言の振る舞いと、一致します。
変数の
Any 初期化子と同様で、
Any は、
New Expression または
Placement New 演算子と一緒に使って、新しくつくられたオブジェクトを初期化されないままにすることができます(構築子を持たないデータ型でのみ使用可能)。
- Instr/InstrRev (8番目の構文):
Any は、
substring パラメーターの修飾語として、
Instr または
InstrRev と共に使うことができます。
Any は、その中のどんな個々の文字にも一致するからです。
- Procptr (9番目の構文):
Any、つまり任意のプロシージャシグネチャは、(使わない場合と比べて)特定の選択を引き起こすことはなく、常に2つの引数を持つ
Procptr を書くことができます。
例:
Declare Sub echo(ByVal x As Any Ptr) '' echo は、どんなポインター型も受け入れます
Dim As Integer a(0 To 9) = Any '' この変数は初期化されません
Dim As Double d(0 To 4)
Dim p As Any Ptr
Dim pa As Integer Ptr = @a(0)
Print "Not initialized ";
echo pa '' echo に、整数へのポインターを渡します
Dim pd As Double Ptr = @d(0)
Print "Initialized ";
echo pd '' echo に、倍精度へのポインターを渡します
p = pa '' p に整数へのポインターを代入します
p = pd '' p に倍精度へのポインターを代入します
Sleep
Sub echo (ByVal x As Any Ptr)
Dim As Integer i
For i = 0 To 39
'echo は、ポインター中のデータをバイトとして解釈します
Print Cast(UByte Ptr, x)[i] & " ";
Next
Print
End Sub
'変数の型検査を不能にする ANY の例
Declare Sub echo (ByRef a As Any) '' ANYは、関数に渡されたデータの型のためのチェックを、不能にします
Dim x As Single
x = -15
echo x '' 整数を予想する関数に単精度を渡します。コンパイラは、不満を言いません!!
Sleep
Sub echo (ByRef a As Integer)
Print Hex(a)
End Sub
Dim a(Any) As Integer ' 1次元動的配列
Dim b(Any, Any) As Integer ' 2次元動的配列
Dim c(Any, Any, Any) As Integer ' 3次元動的配列
' など
' さらなる Redim や配列アクセスは、一致する数の次元を持っていなければなりません
ReDim a(0 To 1)
ReDim b(1 To 10, 2 To 5)
ReDim c(0 To 9, 0 To 5, 0 To 1)
方言差:
QBからの違い:
- ポインタと initializers(初期化子) は、FreeBASICで新規作成。
参照: