84
ROZDZIAŁ 11. FUNKCJE
jest rozmiar stosu programu). Cała zalwiwa polega na tym, aby umieć dostać się do odpowiedniego argumentu oraz poznać jego typ (używając funkcji printf. mogliśmy wpisać jako argument dowolny typ danych). Do tego celu możemy użyć wszystkich ciekawostek, zawartych w pliku nagłówkowym stdarg.h.
Załóżmy, że chcemy napisać prostą funkcję, która dajmy na to, mnoży wszystkie swoje argumenty (zakładamy, że argumenty są typu int). Przyjmujemy przy tym, że ostatni argument ł>ę<lzie 0. Będzie ona wyglądała tak:
#include <stdarg.h>
int mnoz (int pierwszy, ...)
{
va_list arg;
int iloczyn - 1, t;
va_start (arg, pierwszy);
for (t = pierwszy; t; t = va_arg(arg, int)) { iloczyn *■ t;
va_end (arg); return iloczyn;
vaJist oznacza specjalny typ danych, w którym przechowywane będą argumenty, przekazane do funkcji. Makropolecenie va_arg odczytuje kolejne argumenty i przekształca je do odpowiedniego typu danych. Na zakończenie używane jest makro va_end jest ono obowiązkowe!
Oczywiście, tak samo jak w przypadku funkcji printf() czy scanf(), argumenty nie muszą być takich samych typów. Rozważmy dla przykładu funkcję, podobną do printf(). ale znacznie uproszczoną:
Sinclude <stdarg.h>
void wypisz(const char ‘format, va_list arg; va_start (arg, format); for (; ‘format; ++format) { switch (‘format) {
printf("%d" , va printf("Xu" , va printf("%ld", va printf("%lu", va printf("%f- , va printf ("5Cx" . va printf("%X" , va printf("%s" , va putc(*format);
case case case case case case case case default >
_arg(arg, _arg(arg, _arg(arg, _arg(arg, _arg(arg, _arg(arg, _arg(arg, _arg(arg,
int)); break; unsigned)); break; int)); break; unsigned long)); break; double)); break; unsigned)); break; unsigned)); break; const char *)); break;