Возвращает указатель на первый аргумент в переменном списке аргументов
Синтаксис
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
См. также