Referenz - CVA_START
Syntax: CVA_START (Parameterliste, letzterParameter )
Typ: Makro
Kategorie: Speicher
CVA_START initialisiert ein Objekt für variable Parameterlisten.
- 'Parameterliste' ist eine Variable vom Typ CVA_LIST, die auf die variable Parameterliste verweisen soll.
- 'letzterParameter ' ist der letzte Parameter vor der Ellipsis ...
Unter FreeBASIC ist es möglich, Prozeduren zu erstellen, die keine festgelegte Parameterliste besitzen. Diesen Prozeduren darf eine beliebig lange Parameterliste übergeben werden, und die Parameter dürfen von jedem Datentyp sein. Eine solche Liste wird variable Parameterliste genannt. Um dies zu ermöglichen, verwendet man bei DECLARE und im Prozedurheader folgende Syntax:
DECLARE {SUB|FUNCTION} (<'normaleParameter'>, ...)
'normaleParameter' ist dabei eine normale Parameterliste, wie bei DECLARE erklärt. Das '...' leitet die variable Parameterliste ein.
CVA_START kann nur in Prozeduren mit variabler Parameterliste eingesetzt werden. Es initialisiert ein Objekt vom Typ VCA_LIST, mit dem es möglich ist, die Parameter dieser variablen Liste der Reihe nach mittels CVA_ARG auszulesen. Das Makro arbeitet wie ein Konstruktor und benötigt in derselben Prozedur ein abschließendes CVA_END, das wie ein Destruktor arbeitet. Nach einem CVA_END kann auch erneut CVA_START aufgerufen werden (wiederum mit abschließendem CVA_END), um die variable Liste erneut zu initialisieren.
Bei der Übergabe variabler Parameterlisten geht aber die Information verloren, um welche Datentypen es sich in der variablen Liste handelt bzw. wie viele Parameter übergeben wurden. Daher werden oft sogenannte Format-Strings in der normalen Parameterliste übergeben, in denen beschrieben wird, welche Parameter übergeben wurden. Dieser Format-String darf jedes beliebige Format besitzen, da der Programmierer die Parameterübergabe komplett selbst übernimmt. Der String muss ihm lediglich die Informationen liefern, die er braucht, um die Werte aus der variablen Parameterliste herauszulesen.
CVA_ARG wird dazu benutzt, um den Wert eines Parameters zu ermitteln. Zu Beginn zeigt CVA_ARG auf den ersten Parameter hinter 'letzterParameter'. Bei jedem Aufruf von CVA_ARG wird der Zeiger automatisch weitergerückt.
Beispiel 1: Parameterliste mit festgelegtem Datentyp
SUB VarListProc CDECL (anzahl AS INTEGER, ... )
' anzahl gibt die Länge der variablen Parameterliste an.
' Als Datentyp werden INTEGER-Werte erwartet
DIM argumente AS CVA_LIST
CVA_START(argumente, anzahl)
FOR i AS INTEGER = 1 TO anzahl
PRINT CVA_ARG(argumente, INTEGER)
NEXT
CVA_END(argumente)
END SUB
VarListProc 4, 4000, 300, 20, 1
SLEEP
Beispiel 2: Parameterliste mit Format-String
SUB myPrint CDECL (FormatierString AS STRING, ...)
DIM argumente AS CVA_LIST
CVA_START(argumente, FormatierString)
FOR i AS INTEGER = 1 TO LEN(FormatierString)
SELECT CASE MID(FormatierString, i, 1)
CASE "i"
PRINT "Integer: " & CVA_ARG(argumente, INTEGER)
CASE "l"
PRINT "LONGINT: " & CVA_ARG(argumente, LONGINT)
CASE "f", "d"
PRINT "DOUBLE: " & CVA_ARG(argumente, DOUBLE)
CASE "s"
' Ein String wird intern als ZSTRING übergeben.
PRINT "STRING: " & *CVA_ARG(argumente, ZSTRING PTR)
END SELECT
NEXT
CVA_END(argumente)
END SUB
DIM AS STRING s = "String1"
myPrint( "ilfdss", 1, 4294967296, 1.2, 3.4, s, "String2" )
SLEEP
Hinweis:
Eine SUB/FUNCTION, die eine variable Parameterliste verwendet, muss zwingend mit CDECL deklariert werden. Ansonsten meldet der Compiler einen Fehler.
Unterschiede zu QB: neu in FreeBASIC
Plattformbedingte Unterschiede:
Der exakte Datentyp und die Größe von CVA_LIST ist plattformabhängig.
Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v1.07.0
Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CVA_START nicht zur Verfügung und kann nur über __CVA_START aufgerufen werden.
Siehe auch:
CVA_COPY, CVA_ARG, CVA_END, DECLARE, SUB, FUNCTION, CDECL, Datentypen, ... (Auslassung[Ellipsis]), Prozeduren
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|