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

FreeBASIC VaFirst

目次→命令文→手続きVA_FIRST←オリジナル・サイト

VA_FIRST 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

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

可変引数リストの、最初の引数へのポインタを返します。

構文:
pointer_variable = va_first()

記述:
va_first 関数は、関数に渡された最初の変数の引数を指す、タイプされていない pointer 値を、提供します。

-gen gcc を使う場合はサポートされません。 プラットフォーム間の互換性のために、cva_list 可変個数引数リスト形式を使います。

例:
Function average cdecl(count As Integer, ... ) As Double
    Dim arg As Any Ptr
    Dim sum As Double = 0
    Dim i As Integer
   
    arg = va_first()

    For i = 1 To count
        sum += va_arg(arg, Double)
        arg = va_next(arg, Double)
    Next
   
    Return sum / count
End Function

Print average(4, 3.4,5.0,3.2,4.1)  '' 渡す変数の引数は、すべて double 型でなければなりません
Print average(2, 65.2,454.65481)   '' 渡す変数の引数は、すべて double 型でなければなりません
Sleep



出力は、下のようになるでしょう:
3.925
259.927405


'' 単純なカスタム printf の例
Sub myprintf cdecl(ByRef formatstring As String, ...)
    '' 最初の var-arg へのポインターを取得
    Dim As Any Ptr arg = va_first()

    '' フォーマット文字列の各文字について...
    Dim As UByte Ptr p = StrPtr(formatstring)
    Dim As Integer todo = Len(formatstring)
    While (todo > 0)
        Dim As Integer char = *p
        p += 1
        todo -= 1

        '' Is it a format char?
        If (char = Asc("%")) Then
            If (todo = 0) Then
                '' % at the end
                Print "%";
                Exit While
            End If

            '' 次の文字は型を伝えます
            char = *p
            p += 1
            todo -= 1

            '' var-arg を表示。型に従って
            Select Case char
            '' integer?
            Case Asc("i")
                Print Str(va_arg(arg, Integer));
                '' 注意、 C との違い: va_next() を使わなければなりません。
                '' va_arg() は、ポインターを更新しないからです。
                arg = va_next(arg, Integer)

            '' long integer? (64-bit)
            Case Asc("l")
                Print Str(va_arg(arg, LongInt));
                arg = va_next(arg, LongInt)

            '' single or double?
            '' Note: because the C ABI, var-args に渡されたシングルは、
            '' 全てダブルに変換されます。
            Case Asc( "f" ), Asc( "d" )
                Print Str(va_arg(arg, Double));
                arg = va_next(arg, Double)

            '' string?
            Case Asc("s")
                '' 文字列は byval で渡されます。したがって、長さは未知です。
                Print *va_arg(arg, ZString Ptr);
                arg = va_next(arg, ZString Ptr)

            End Select

        '' Ordinary char, just print as-is
        Else
            Print Chr( char );
        End If
    Wend
End Sub

    Dim As String s = "bar"

    myprintf(!"integer=%i, longint=%l single=%f, double=%d, string=%s, string=%s\n", _
             1, 1ll Shl 32, 2.2, 3.3, "foo", s)

    Sleep



方言差:

QBからの違い:

参照:
手続きに戻る
変数引数 に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-03-10 14:13:57
日本語翻訳:WATANABE Makoto、原文著作者:RandyKeeling

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

表示-非営利-継承