====== Funktionen mit variabler Anzahl von Parameter ======
:?: Wie schreibe ich eine Funktion, die, wie z.B. die printf(), eine variable Anzahl von Parameter hat?
(Als Grundlage für dieses Beispiel wurde [[http://pronix.linuxdelta.de/C/standard_C/c_programmierung_21.shtml]] von [[http://pronix.linuxdelta.de/impressum/index.shtml|Jürgen Wolf]] genutzt.)
Die **printf()** ist wie folgt deklariert:
int printf(const char *format, ...);
Um solche Funktionen wie printf() zu schreiben sind folgende Makros aus **%%%%** nötig:
^Makro ^Syntax ^Kommentar ^
|va_list |va_list name; |Abstrakter Datentyp, mit dem die Liste der Parameter definiert wird. |
|va_start |va_start(va_list name, lastarg); |Argumentliste wird initialisiert. |
|va_arg |typ = va_arg(va_list name,typ); |Liest den nächsten Parameter in der Argumentliste. |
|va_end |void va_end(va_list name); |Schließt die Argumentliste. |
Als erstes Beispiel, eine Funktion, die das Ende der Parameterliste an einem bestimmten Wert erkennt.
#include
#include
int addInt (int iZahlen, ...) // Berechnet die Summe aller als Parameter angegebenen Zahlen
{
va_list pParameter;
int iAktuelleZahl;
va_start(pParameter, iZahlen); // Pointer auf den 1. Parameter setzen
do
{
iAktuelleZahl = va_arg(pParameter, int);
iZahlen += iAktuelleZahl;
} while (iAktuelleZahl != 0); // Die Zahl 0 dient als Begrenzer der Zahlenreihe
va_end(pParameter);
return iZahlen;
} // addInt()
int main ()
{
int iSumme;
printf("1 + 3 + 8 = %d\n", addInt(1, 3, 8, 0));
iSumme = addInt(10, 15, 27, 0) + addInt(3, 13, 33, 0);
printf("(10 + 15 + 27) + (3 + 13 + 33) = %d\n", iSumme);
return 0;
} // main()
Als zweites Beispiel, eine Funktion, die die Anzahl der (restlichen) Parameter als Wert im ersten Parameter übergibt.
#include
#include
void printInt (int iAnzahl, ...)
{
va_list pParameter;
int iAktuelleZahl;
int i;
printf("Es werden %d Zahlen ausgegeben:\n", iAnzahl);
va_start(pParameter, iAnzahl); // Pointer auf den 1. Parameter setzen
for (i = 1; i <= iAnzahl; i++)
{
iAktuelleZahl = va_arg(pParameter, int);
printf("%d\t", iAktuelleZahl);
} // for
printf("\n");
va_end(pParameter);
} // printInt()
int main ()
{
printInt(4, 1, 2, 3, 4); // 4 Zahlen ausgeben (1 + 4 Parameter)
printInt(6, 11, 22, 33, 44, 55, 66); // 6 Zahlen ausgeben (1 + 6 Parameter)
return 0;
} // main()
In diesem Zusammenhang sind die Funktionen **vprintf()**, **vsprintf()** und **vfsprintf()** von Interesse.
FIXME
----
Stand: 21.11.2012
--- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]//
EOF