====== 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