W tym materiale wyjaśnię Ci jeden z ciekawszych terminów jaki występuje w programowaniu: zmienna liczba parametrów 🎉! Jest szansa, że już Ci się przewinął przez uszy chociaż raz i warto poznać samą konstrukcję, zasadę działania oraz sytuacje, w których staje się to pożyteczne 👍. Jak zwykle zapraszam do środka 😉!

WYJAŚNIAM CZYM JEST ZMIENNA LICZBA PARAMETRÓW W PROGRAMOWANIU!

Rozpoczniemy od wyjaśnienia sobie samego pojęcia, potem przejdziemy do teorii, a na sam koniec, prezentacja na prostym przykładzie kodu źródłowego i w ten sposób będziesz mieć komplet informacji 😄!

Czym jest zmienna liczba parametrów w programowaniu?

W programowaniu, zmienna liczba parametrów (czy też nazywana zamiennie "zmienna liczba argumentów" ℹ️) to konstrukcja w kodzie źródłowym, dzięki której dana funkcja może przyjmować dowolną liczbę parametrów 🔥! Nie tak jak zwykle, że zawsze jest konkretnie jeden parametr bądź wcale ich nie przyjmuje. W grę wchodzi dowolna liczba parametrów i w każdym przypadku funkcja prawidłowo wykona określone zadanie 👍. Określa się wtedy taką funkcję "funkcją o zmiennej liczbie parametrów" (ang. variadic function) 🌟.

Czasami możesz też natrafić na nietypowe określenie "varargs", czyli w skrócie "variable arguments", co w polskim tłumaczeniu oznacza dokładnie to, co jest zawarte w tytule tego artykułu 😊.

Należy mieć świadomość, że to rodzi pewne ograniczenia i to wcale nie oznacza, że nagle będziemy mogli wprowadzać w miejsce parametrów wszystko jak leci 🙂. Gdy dojdziemy do kodu źródłowego, wtedy będę mógł precyzyjnie wypunktować konkretne rzeczy 👆. Natomiast jak najbardziej charakteryzuje się jedną wielką zaletą ➕!

Kiedy najlepiej zastosować zmienną liczbę parametrów w programowaniu?

Zmienna liczba parametrów wykazuje najlepszą użyteczność przy takich zadaniach, w których rozwiązanie zawsze może zostać wyznaczone bez względu na liczbę wprowadzonych parametrów ❤️. Prostym przykładem jest suma liczb. Jeżeli nie ma czego dodawać do siebie, to wynikiem będzie 0 (zero) 0️⃣. Podanie dwóch liczb a i b sprawi, że otrzymamy wynik w postaci sumy wyrazów a i b. A jak wprowadzimy 100 różnych liczb, to z tego też wyjdzie suma 😉. Jakiś wynik zawsze będzie możliwy do wyznaczenia i liczba parametrów w żaden sposób nie wzbudzi ryzyka nieprawidłowego wykonania instrukcji 👍.

Ostatnia rzecz warta podkreślenia i ruszamy z kodem!

Czy funkcja o zmiennej liczbie parametrów może przyjmować inne parametry?

Funkcja o zmiennej liczbie parametrów oczywiście może przyjmować jakiekolwiek konkretne parametry i jednocześnie posiadać dowolną liczbę parametrów konkretnego typu, natomiast musi spełniać 2 kluczowe warunki 👇:

  1. parametr oznaczający zmienną liczbę musi się znaleźć na samym końcu listy parametrów (inaczej nie byłoby możliwe ustalić na którym miejscu zakończył(a)byś wprowadzanie nieregularnej liczby parametrów, a kiedy zaczynasz podawać wartości do tych konkretnych),
  2. wszystkie parametry dotyczące zmiennej liczby muszą być tego samego typu danych (czyli np. wszystkie wartości typu "int").

W przeciwnym razie, język nie dopuści Cię do uruchomienia programu ✋!

Tyle z teorii, więc czas na krótki przykład użycia w kodzie źródłowym języka C 🚀!

Przykład kodu źródłowego ze zmienną liczbą parametrów

Oto przykład w języku C ukazujący użycie zmiennej liczby parametrów wobec funkcji sumującej liczby całkowite 👇:

#include <stdio.h>
#include <stdarg.h>

int getSumOf(int numbersCount, ...);

int main(void)
{
	printf("2 + 5 = %d\n", getSumOf(2, 2, 5));
	printf("10 + 8 + 6 = %d\n", getSumOf(3, 10, 8, 6));
	printf("65 + 34 + 17 + 56 + 80 = %d\n", getSumOf(5, 65, 34, 17, 56, 80));

	return 0;
}

int getSumOf(int numbersCount, ...)
{
	va_list arguments;
	int sum = 0;

	va_start(arguments, numbersCount);

	for (int i = 0; i < numbersCount; i++)
	{
		sum += va_arg(arguments, int);
	}

	va_end(arguments);

	return sum;
}

Wyjaśniam każdą instrukcję idąc od samej góry 📜!

Dyrektywy

Na początku korzystamy z dwóch dyrektyw jakie będą nam potrzebne celem odwoływania się do funkcji. "stdio.h" służy jak zwykle do wywołania funkcji "printf", natomiast przypatrz się tej drugiej dyrektywie: "stdarg.h" 👀! Ona posiada zestaw makr przygotowanych pod zmienną liczbę parametrów 🔥!

Prototyp funkcji sumującej liczby przy użyciu zmiennej liczby parametrów

Pod dyrektywami jest wstawiony prototyp funkcji do wyznaczania sumy podanych liczb. Zwróć szczególną uwagę na część związaną z parametrami 👇:

(int numbersCount, ...)

W wielu językach programowania (w tym w języku C) charakterystycznym oznaczeniem zmiennej liczby argumentów jest wielokropek 💥! Ponadto akurat w języku C jest konieczność poprzedzenia zmiennej liczby parametrów konkretnym parametrem w postaci liczby całkowitej ("int") oznaczającej ile parametrów mamy zamiar wprowadzić do wywołania funkcji ⚠️. Język C nie posiada zdolności do "odczytywania" liczby podanych argumentów, tak jak niektóre inne języki np. Java, stąd musimy za każdym razem określić w parametrze ilu liczb się spodziewać 💡.

Całe postępowanie zmiennej liczby parametrów opiera się na pobieraniu jednej wartości po drugiej przy użyciu pętli "for" i to jest wpisane w samą technikę, niezależnie od języka programowania ⏩!

Funkcja "main"

Kolejnym fragmentem powyższego kodu jest funkcja uruchomieniowa "main", w której znajdują się 3 wywołania tej samej funkcji o zmiennej liczbie parametrów 🙂. Zauważ, że każde z wywołań różni się liczbą podanych parametrów 👇:

getSumOf(2, 2, 5)
getSumOf(3, 10, 8, 6)
getSumOf(5, 65, 34, 17, 56, 80)

i to jest w porządku 😊. Właśnie to jest punkt kulminacyjny zmiennej liczby parametrów 👀!

Jak wspomniałem, w języku C występuje ten mały "haczyk", że trzeba każdorazowo podać ile parametrów wprowadzamy do wywołania, zanim zaczniemy po kolei je wpisywać ile dusza zapragnie ⚠️. W tym języku jest to o tyle ważne, że pomyłka w którąkolwiek stronę przyniesie nieprzyjemne konsekwencje 😳. Gdy podasz zbyt małą liczbę, to wynik będzie nieprawidłowy, a jak z kolei przypiszesz większą wartość niż znajdzie się liczb, to doprowadzisz do niezdefiniowanego zachowania, co jest bardzo niebezpieczne w języku C ⛔! Dlatego pamiętaj o tym i upewnij się, że podajesz wartość zgodną z prawdą 🫵!

Teraz przejdźmy do samej treści funkcji sumującej 😊!

Funkcja sumująca liczby przy użyciu zmiennej liczby parametrów

W pierwszej kolejności tworzymy sobie zmienną o specjalnym typie danych "va_list" 🔥. Jest to obiekt przeznaczony do nawiązania połączenia z podanymi parametrami, aby w toku przetwarzania instrukcji uzyskiwać do nich dostęp i przechodzić jeden po drugim 😮! Niżej mamy liczbę całkowitą do przechowywania sumy liczb, której przypisujemy wartość początkową 0 (zero) 0️⃣.

Następnie mamy wywołanie funkcji związanej ze zmienną liczbą parametrów: "va_start", która oznacza rozpoczęcie uzyskiwania dostępu do parametrów 🔓. Wstawienie jej (tak zresztą jak reszty wywołań funkcji o podobnych nazwach) jest obowiązkowe w języku C i nie wolno zapomnieć o żadnym z nich, jeśli chcemy prawidłowo obsłużyć nieregularną liczbę parametrów ⚠️! Parametry jakie przyjmuje, to obiekt typu "va_list" oraz liczbę parametrów ilu ma się spodziewać. Aby było wiadome do jakiego parametru przestać powtarzać instrukcje, opieramy się na podanym pierwszym parametrze jako liczba podanych liczb i dlatego ta informacja musi zostać zawarta 🙂.

Dalej mamy pętlę "for", dzięki której możliwa jest obsługa każdego z podanych parametrów i po raz kolejny korzystamy z pierwszego parametru jako warunek zakończenia 😇. W środku niej mamy tylko instrukcję dodawania liczby do sumy, natomiast popatrz na samo wywołanie 👇:

sum += va_arg(arguments, int);

"va_arg" jest kolejnym "elementem układanki" 🧩 i oznacza pobranie następnego w kolejności parametru z miejsca występowania wielokropka (to już jest ten drugi parametr) ❤️! Przyjmuje własne parametry jako obiekt przechowujący wszystkie parametry oraz typ danych wartości jaki ma pobrać. W naszym przypadku uwzględniamy same liczby całkowite, czyli to będzie "int" 👍.

Po zakończeniu działania w pętli, na samym końcu widnieje zakończenie pobierania zmiennej liczby parametrów jako wywołanie funkcji "va_end", która musi otrzymać w jedynym parametrze obiekt typu "va_list"! Tak się kończy cała obsługa zmiennej liczby parametrów 😉!

Gdy skompilujesz sobie ten program i uruchomisz go, to ujrzysz poprawnie wyliczone sumy we wszystkich trzech wywołaniach funkcji o zmiennej liczbie parametrów 🏆! Podstawą prawidłowo działającej takiej funkcji jest to, aby gwarantowała otrzymanie prawidłowego rozwiązania niezależnie od tego, ile podamy parametrów ☑️.

Zmienna liczba parametrów w programowaniu

Zmienna liczba parametrów odnosi się do funkcji mogących przyjmować nieregularną liczbę parametrów podczas jej wywołania, a wynik jej działania będzie zawsze możliwy do ustalenia niezależnie od podanej liczby argumentów.

Miej na uwadze, że zapis będzie się znacząco różnił w zależności od języka programowania, a może być tak, że dany język nawet nie będzie wspierał takiej konstrukcji ⚠️! 


Wszystko w tym temacie. Zmienna liczba parametrów jest tematem zdecydowanie opcjonalnym i raczej bardzo rzadko zdarzy się, abyś musiał(a) z tego skorzystać nie widząc żadnego innego sposobu zapisu 🙂.

PODOBNE ARTYKUŁY