84 ROZDZIAŁ 11. FUNKCJE jest rozmiar stosu programu). Cała zabawa 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 będzie 0. Będzie ona wyglądała tak: #include 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; } va list oznacza specjalny typ danych, w którym przechowywane będą argumen- ty, przekazane do funkcji. Makropolecenie va arg odczytuje kolejne argumenty i prze- kształ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ą: #include void wypisz(const char *format, ...) { va_list arg; va_start (arg, format); for (; *format; ++format) { switch (*format) { case ’i’: printf("%d" , va_arg(arg, int)); break; case ’I’: printf("%u" , va_arg(arg, unsigned)); break; case ’l’: printf("%ld", va_arg(arg, int)); break; case ’L’: printf("%lu", va_arg(arg, unsigned long)); break; case ’f’: printf("%f" , va_arg(arg, double)); break; case ’x’: printf("%x" , va_arg(arg, unsigned)); break; case ’X’: printf("%X" , va_arg(arg, unsigned)); break; case ’s’: printf("%s" , va_arg(arg, const char *)); break; default : putc(*format); } } va_end (arg); }
... zobacz całą notatkę
Komentarze użytkowników (0)