Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - CVA_START

Referenz-Navigation

 

Syntax: CVA_START (Parameterliste, letzterParameter )
Typ: Makro
Kategorie: Speicher

CVA_START initialisiert ein Objekt für variable Parameterlisten.

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 BefehlsreferenzeintragDECLARE und im Prozedurheader folgende Syntax:

DECLARE {SUB|FUNCTION} (<'normaleParameter'>, ...)

'normaleParameter' ist dabei eine normale Parameterliste, wie bei BefehlsreferenzeintragDECLARE 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 BefehlsreferenzeintragCVA_ARG auszulesen. Das Makro arbeitet wie ein BefehlsreferenzeintragKonstruktor und benötigt in derselben Prozedur ein abschließendes BefehlsreferenzeintragCVA_END, das wie ein BefehlsreferenzeintragDestruktor 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 BefehlsreferenzeintragSUB/BefehlsreferenzeintragFUNCTION, die eine variable Parameterliste verwendet, muss zwingend mit BefehlsreferenzeintragCDECL 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 Befehlsreferenzeintrag-lang qb steht CVA_START nicht zur Verfügung und kann nur über __CVA_START aufgerufen werden.

Siehe auch:
BefehlsreferenzeintragCVA_COPY, BefehlsreferenzeintragCVA_ARG, BefehlsreferenzeintragCVA_END, BefehlsreferenzeintragDECLARE, BefehlsreferenzeintragSUB, BefehlsreferenzeintragFUNCTION, BefehlsreferenzeintragCDECL, BefehlsreferenzeintragDatentypen, Befehlsreferenzeintrag... (Auslassung[Ellipsis]), BefehlsreferenzeintragProzeduren


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 18.08.2020 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 20.08.2020 von Redakteurnemored gespeichert.
  Versionen Versionen