Tutorial
Variable Parameterlisten
von MOD | Seite 2 von 4 |
Umgang mit Strings und Types
Bei den meisten Datentypen muss man nichts besonderes beachten. Dies gilt aber nicht für UDTs und Strings. Bei den Strings ergibt sich der Unterschied, da sie intern auch eine Art UDT sind.
Fangen wir mit den Strings an. Ein String kann als solches problemlos übergeben werden, um ihn aber in der Funktion auslesen zu können, muss er als ZString Ptr behandelt werden:
Function add Cdecl (anzahl As Integer, ...) As String
Dim As String ergebnis
Dim As Any Ptr argument = va_first()
For i As Integer = 1 To anzahl
ergebnis += *va_arg(argument, ZString Ptr)
argument = va_next(argument, ZString Ptr)
Next
Return ergebnis
End Function
Dim As String text1 = "Hallo "
Dim As String text2 = "Welt!"
Print add(2, text1, text2)
Sleep
UDTs müssen, ähnlich den Strings, auch als Pointer behandelt werden. Eine einfache Art dies zu bewerkstelligen ist die folgende:
Type myType
As String foo
As Integer bar
End Type
Sub PrintMyType Cdecl (anzahl As Integer, ...)
Dim As Any Ptr argument = va_first()
Dim As myType Ptr temp
For i As Integer = 1 To anzahl
temp = va_arg(argument, myType Ptr)
Print temp->foo, temp->bar
argument = va_next(argument, myType Ptr)
Next
End Sub
Dim As myType test1
Dim As myType test2
test1.foo = "Nummer 1"
test2.bar = 2
PrintMyType(2, @test1, @test2)
Sleep
Gemischte Datentypen
Soll die variable Parameterliste nun verschiedene Datentypen enthalten, stehen wir natürlich vor einem Problem. Wir wissen, dass die Daten im Speicher liegen, aber um sie auszulesen, müssen wir nicht nur wissen, wie viele Parameter wir erwarten, nein auch der Datentyp muss bekannt sein um die Daten sinnvoll interpretieren zu können.
Eine Lösung wäre nun, den ersten Parameter als 'Formatstring' zu verwenden. Hier bietet der Referenzeintrag von VA_FIRST ein solch gutes Beispiel (das zweite 'verkürzte' Beispiel ist besonders anschaulich), dass ich an dieser Stelle nur auf den Artikel verweise.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|