FreeBASIC マニュアルのトップに戻る

FreeBASIC ProPgPassingArrays

目次→教本→プログラマーのための案内Passing Arrays to Procedures←オリジナル・サイト

配列を手続きに渡す 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

配列パラメーターの宣言/定義、および手続きへの配列引数の受け渡し

配列シンボル名の構文
手続き宣言のパラメーターとして:
( [ any [, any...] ] ) as datatype
array_name( [ any [, any...] ] ) as datatype
手続き定義のパラメーターとして:
array_name( [ any [, any...] ] ) as datatype
手続き呼び出しの引数として:
array_name()

パラメータ/引数が配列であることを指定するには、括弧(空でも)が必須です。

配列シンボル名の使用
配列パラメーターを使って手続きを宣言する場合:
declare { sub | function } proc_name ... ( ( [ any [, any...] ] ) as datatype , ... ) [ ... ]
declare { sub | function } proc_name ... ( array_parameter_name( [ any [, any...] ] ) as datatype , ... ) [ ... ]
配列パラメーターを使って手続きを定義する場合:
{ sub | function } proc_name ... ( array_parameter_name( [ any [, any...] ] ) as datatype , ... ) [ ... ]
配列引数を手続きに渡す場合:
sub_name ( array_argument_name() , ... )
sub_name array_argument_name() , ...
funct_name ( array_argument_name() , ... )
funct_name array_argument_name() , ...
... funct_name ( array_argument_name() , ... ) [ ... ]

(パラメーター/引数リストと同じルール):
手続きを宣言/定義するときは、空でないパラメータリストを囲む括弧が必要です。
サブルーチンを呼び出すとき、引数リストを囲む括弧(空または空でない)はオプションです。
関数をサブルーチンとして(戻り変数を使わずに)呼び出す場合、サブルーチンと同じ規則が適用されます。
関数を式(戻り値を使用)で呼び出す場合、空でない引数リストを囲む括弧が必要です。
ただし、手続き呼び出しを示すために、手続き名の後に常に括弧(空または空でない)を使うのが一般的な規則です。

説明
配列は、通常のパラメーターと同じ方法で渡されないため、配列パラメーターの前に byvalbyref キーワードを含めることはできません。
変数は、値または参照によって渡されますが、配列は、記述子によって渡されます(以下を参照)。
実際、配列が手続きに渡されるとき、渡されるのは、記述子への参照です。

渡された配列のすべての要素は変更でき、それらの変更は呼び出しレベルで反映されます。
もしかすると byref は、可変長文字列(記述子によっても渡される)との類似性によって許可されるでしょう。

値によって配列を渡す直接の可能性はありません。
渡された配列パラメーターを as constant として宣言すると、手続き本体の変更のみが禁止されます。
回避策は、配列のユーザー・コピーを渡すことです。

注:
関数の戻り値を、配列型変数にすることはできません。
固定長の string 配列を手続きに渡すことはできません。
zstring/wstring サイズは渡されないため、zstring/wstring 配列を単純に手続きに渡すことはできません( "as zstring/wstring * 1" 型は、デフォルトでは手続き本体のコンパイラによって取得されます)。
現時点では、コンパイラは、手続きの本体で各配列要素のアドレスを正しく計算せずに、黙って失敗するというバグがあります(明らかに最初の要素を除く)。

配列記述子 (情報提供のみ):
固定長配列の場合、記述子は、配列を手続きに渡すためだけに使われます(そうでない場合、コンパイラは配列の固定特性を知っているので、記述子を使いません)。
可変長配列の場合、記述子は常に使われます(配列記述子は配列の特性を定義する唯一のものです)。

配列記述子の構造は次のとおりです(各項目は、'Any Ptr' か 'Uinteger' でコーディングされます。ただし lbound と ubound だけは 'Integer' です):
- 実要素または仮想要素へのポインター: @array(0, 0, ...)
- 最初の実要素へのポインター: @array(lbound1, lbound2, ...)
- バイト単位の "global" サイズ: (ubound1 - lbound1 + 1) * (ubound2 - lbound2 + 1) * ... * (size of 1 element in bytes)
- バイト単位の 1つの要素のサイズ
- 次元の数
-(*): 配列は固定長メモリ(1ビット)を指す / 配列は最初の宣言で定義された nb の次元を持つ / 記述子(4ビット)に割り当てられた次元の nb
そして各次元について:
- 要素数: (ubound - lbound + 1)
- lbound
- ubound

(*): 追加のメンバー項目('Uinteger')。fbc バージョン >= 1.08
(インクルードファイルを参照ください ./inc/fbc-int/array.bi。 fbc バージョン >= 1.07)

詳細は、FBARRAY (配列記述子の構造とアクセス) を参照してください。


Declare Sub splitString(ByVal As String, (Any) As String, ByVal As UByte = Asc(","))


Dim As String s = "プログラマーのための案内/変数とデータの型/配列/配列を手続きに渡す"
Dim As String array(Any)

splitString(s, array(), Asc("/"))

Print "分割する文字列:"
Print s
Print
Print "分割した結果の配列:"
For i As Integer = LBound(array) To UBound(array)
    Print i, array(i)
Next i

Sleep


Sub splitString(ByVal source As String, destination(Any) As String, ByVal delimitor As UByte)
    Do
        Dim As Integer position = InStr(1, source, Chr(delimitor))
        ReDim Preserve destination(UBound(destination) + 1)
        If position = 0 Then
            destination(UBound(destination)) = source
            Exit Do
        End If
        destination(UBound(destination)) = Left(source, position - 1)
        source = Mid(source, position + 1)
    Loop
End Sub

参照
プログラマーのための案内に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2022-05-30 05:58:23
日本語翻訳:WATANABE Makoto、原文著作者:fxm

ホームページのトップに戻る

表示-非営利-継承