va_first
 
Возвращает указатель на первый аргумент в переменном списке аргументов

Синтаксис

pointer_variable = va_first()

Описание

Функция va_first предоставляет нетипизированный pointer(указатель) на значение, которое указывает на первый аргумент переменной, переданный функции.

Пример

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)
Print average(2, 65.2,454.65481)
Sleep


Вывод:
3.925
259.927405

'' Пример простого пользовательского printf
Sub myprintf cdecl(ByRef formatstring As String, ...)
    '' Получить указатель на первый var-arg
    Dim As Any Ptr arg = va_first()

    '' Для каждого char в форматированной строке...
    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

        '' Это в формате char?
        If (char = Asc("%")) Then
            If (todo = 0) Then
                '' % в конце
                Print "%";
                Exit While
            End If

            '' Далее char должен указать тип
            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-бита)
            Case Asc("l")
                Print Str(va_arg(arg, LongInt));
                arg = va_next(arg, LongInt)

            '' single или double?
            '' Примечание: Из-за C ABI, все single передаваемые в
            '' var-arg , преобразуются в Double.
            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

        '' Обычный char, просто печатается как есть
        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


Различия диалектов

  • Нет в наличии в диалекте -lang qb , но есть псевдоним __Va_first.

Отличия от QB

  • Новое в FreeBASIC

См. также