czwartek, 26 kwietnia 2018

Język C - Argumenty zmienne


C - Argumenty zmienne

Czasami możesz natknąć się na sytuację, gdy chcesz mieć funkcję, która może przyjmować zmienną liczbę argumentów, tj. parametrów, zamiast wstępnie określonej liczby parametrów. Język programowania C zapewnia rozwiązanie tej sytuacji i można zdefiniować funkcję, która może przyjąć zmienną liczbę parametrów w zależności od wymagań użytkownika. Poniższy przykład pokazuje definicję takiej funkcji.
int funk(int, ... ) {
   .
   .
   .
}

int main() {
   funk(1, 2, 3);
   funk(1, 2, 3, 4);
}
Należy zauważyć, że funkcja funk() ma swój ostatni argument jako wielokropek, tj. trzy kropki (...), a ten tuż przed tym jest zawsze int, który będzie reprezentował liczbę całkowitą przekazywanych zmiennych liczbowych. Aby skorzystać z takiej funkcjonalności, należy użyć pliku nagłówkowego stdarg.h, który udostępnia funkcje i makra do implementacji funkcjonalności zmiennych argumentów i postępuje zgodnie z podanymi krokami:
·      Zdefiniuj funkcję, której ostatnim parametrem jest wielokropek, a tuż przed nim jest zawsze int, który będzie reprezentował liczbę argumentów.
·      Utwórz zmienną typu va_list w definicji funkcji. Ten typ jest zdefiniowany w pliku nagłówkowym stdarg.h.
·      Użyj parametru int i makra va_start, aby zainicjować zmienną va_list na liście argumentów. Makro va_start jest zdefiniowane w pliku nagłówkowym stdarg.h.
·      Użyj zmiennej va_arg makro i va_list, aby uzyskać dostęp do każdego elementu na liście argumentów.
·      Użyj makra va_end, aby wyczyścić pamięć przypisaną do zmiennej va_list .
Teraz przejdźmy do powyższych kroków i zapiszmy prostą funkcję, która może przyjąć zmienną liczbę parametrów i zwrócić ich średnią:
#include <stdio.h>
#include <stdarg.h>

double srednia(int num,...) {

   va_list valist;
   double sum = 0.0;
   int i;

   /* incjalizacja valist dla liczby argumentów */
   va_start(valist, num);

   /* uzyskanie dostępu do wszystkich argumentów przypisanych do Valist */
   for (i = 0; i < num; i++) {
      sum += va_arg(valist, int);
   }
       
   /* Czysta pamięć zarezerwowana dla Valist */
   va_end(valist);

   return sum/num;
}

int main() {
   printf("Średnia liczb 2, 3, 4, 5 = %f\n", srednia(4, 2,3,4,5));
   printf("Średnia liczb 5, 10, 15 = %f\n", srednia(3, 5,10,15));
}
Gdy powyższy kod zostanie skompilowany i wykonany, wygeneruje się następujący wynik. Należy zauważyć, że funkcja srednia() została wywołana dwukrotnie i za każdym razem pierwszy argument reprezentuje całkowitą liczbę przekazywanych zmiennych. Do przekazania zmiennej liczby argumentów będą używane tylko wielokropki.
Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000


Poprzednia strona                                                          Następna strona



Brak komentarzy:

Prześlij komentarz