001
10.10.2003, 07:59 Uhr
Pablo
Supertux (Operator)
|
Solche Funktionen heißen Ellipsen. Die meisten Programmierspachen legen ihre Argument von "links nach Rechts" auf den Stack auf, C tut das nach de ANSI standarisierung. Aber der Unterschied zwischen C und die meisten Sprachen wie PASCAL ist, dass C Funktionen mit Variable (unbekannte meine ich damit) Länge an Parametern unterstützt, und das sind eben Ellipsen.
Früher hat C immer die Argumnte von rehts nach links gelegt, damit Ellipsen geben kann. Das aber in vielen Fällen ein Nachteil war. Deshalb hat das ANSI-Komite das geändert und nur Argumente von Ellipsen werden von rechts nach links auf den Stack gelegt.
C hat eine Standard Header Datei, stdarg.h, die va_list Zeiger und spezielle Makros definiert um die Abfrage der Argumente zu ermöglichen.
Um eine variable Anzahl von Argumenten innrhalb einer Ellipse abarbeiten zu können, sind folgende Schritte notwendig: (der Zugriff auf die Feste Parameter ändert sich nicht.)
1. Deklaration einen Variablenzeiger des Typs va_list, so
C++: |
va_list arg_list_zgr;
|
2. Aufruf des Makros va_start mit 2 Argumenten: Dem Namen des deklarierten zeigers und des letzten fixen Parameter
C++: |
va_start(arg_list_zgr, letzt_param);
|
http://www.fun-soft.de/showtopic.php?threadid=3745 Ohne diesen Aufruf ist das ganze nicht möglich 3. va_arg gibt den Wert der verschiedene Parameter durch wiederholten Aufruf des Makros, das ertse Argument ist arg_list_zgr und das zweite der Name des Datentyp, zb int.
C++: |
va_arg(arg_list_zgr, [i]datentyp[/i]);
|
Guck mal hier, dieses Rätsel habe ich mit einer Ellipse gelöst: www.fun-soft.de/showtopic.php?threadid=3745
Hier habe ich immer va_arg(az, int), weil ich wusste, dass ich nur ints übergeben würde.
[color="red"]
Bearbeitung: |
Achtung:[/color] Ich wusste, dass ich etwas vergessen habe, und zwar ganz wichtig. Du musst immer das Makro va_end aufrufen, bevor die Funktion verlassen wird, damit arg_list_zgr auf NULL gesetzt wird und den Stack geräumt, sonst kannst du böse Überrraschungen erleben. Das einzige Argument von va_end ist den Zeiger.
C++: |
va_end(arg_list_zgr);
|
|
-- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 10.10.2003 um 08:28 Uhr von Pablo Yanez Trujillo editiert. |