Colobot Wiki
Advertisement

Definicja[]

Funkcja to procedura przekazująca wartość w miejsce swojego wywołania. Wywołanie funkcji ma w języku programowania semantykę wyrażenia. Deklarując bądź definiując funkcję, podaje się, oprócz typów ewentualnych parametrów, typ obliczanej przez nią wartości.

Różnica między funkcją i procedurą polega na tym, że funkcja zwraca jakąś wartość, a procedura nie. W języku CBOT praktycznie między jednym a drugim nie ma różnicy. Na upartego można funkcję zwracającą typ void uznać za procedurę.

Funkcja główna[]

Każdy program w języku CBOT, bez wyjątku, musi i może posiadać tylko jedną funkcję poprzedzoną słowem kluczowym extern.

extern void object::Nazwa()
{

// glowny program

}

Jedyne co można zmienić w deklaracji tej funkcji to Nazwa.

Ogólny opis funkcji[]

Użycie[]

Oprócz funkcji głównej, w programie możemy umieścić także inne funkcje. To pozwala zaoszczędzić czasu i zwiększyć czytelność programu. W jaki sposób? Załóżmy, że mamy taki program:

extern void object::Zdalnie( )
{
	send("order", 1, 100);
	wait(5);
	send("order", 3, 100);
	wait(5);
	send("order", 2, 100);
	wait(5);
	send("order", 4, 100);
	wait(5);
}

Ciągle przepisujemy te same instrukcje, przez co program staje się mało czytelny. W dodatku się prawie niczym nie różnią. Zamiast przepisywać ciągle te dwie linijki, możemy napisać funkcję:

void object::WyślijDoStacji( float op )
{
send("order", op, 100);
wait(5);
}

extern void object::Zdalnie( )
{
WyślijDoStacji(1);
WyślijDoStacji(3);
WyślijDoStacji(2);
WyślijDoStacji(4);
}

Teraz, nie dość, że zaoszczędziliśmy miejsce, czas i nerwy, to w dodatku zwiększyliśmy czytelność programu.

Definicja funkcji[]

W języku CBOT każdą funkcję trzeba definiować PRZED funkcją główną.

Do początkujących: Ma to logiczny sens. Jak program ma użyć jakiejś funkcji, jeśli nie wie jeszcze, że ona istnieje?

Do programistów C++: Nie ma możliwości samodzielnej deklaracji funkcji, choć zwiększyłoby by to czytelność programu i byłoby wygodniejsze umieszczanie wszystkich nazw na górze, a niepotrzebne definicje na dole. Być może zmieni się to w Colobot Gold.

Defininiowanie funkcji:[]

[specyfikator_dostępu] typ_zwracanej_wartości [object::]Nazwa([argumenty])
{
// ciało funkcji
}
Analiza (nazwy podane w nawiasach kwadratowych można pominąć):[]
  1. Specyfikator dostępu - ma to pewien związek z klasami. Generalnie można tu nic nie wpisywać lub słowo public, które sprawi, że funkcja stanie się funkcją publiczną (kilka paragrafów niżej).
  2. Typ zwracanej wartości - funkcja musi zwracać jakąś wartość. Podajemy tu jakikolwiek typ.
  3. object:: - zezwala funkcji na dostęp do pól obiektu, na którym jest wykonywana. (Przeczytaj: wskaźnik this).
  4. Po prostu nazwa.
  5. Argumenty funkcji - jeśli ich nie chcemy, to zostawiamy nawiasy puste.
Przykład:[]
public int object::Funkcja(float liczba, string lancuch)
{
// instrukcje
}

Wywoływanie funkcji:[]

Nazwa([argumenty]);
Przykład:[]
Funkcja(1.2, "tekst");

Funkcje publiczne[]

Umieszczenie słowa kluczowego public przed definicją funkcji sprawi, że funkcja ta będzie dostępna dla wszystkich robotów na aktualnie rozgrywanej mapie.

Przykład działania:[]

Wyobraź sobie, że w jednym robocie jest napisana publiczna funkcja f(). Nie musi być włączony, ale taką funkcję faktycznie posiada w jednym ze swoich programów. Drugi robot, trzeci robot, czwarty robot itd. mogą korzystać z tej funkcji bez problemu. Wystarczy ją wywołać tak jak zwykłą funkcję. Problem pojawi się dopiero wtedy, kiedy pierwszy robot zostanie zniszczony, wtedy kod funkcji przepada (przynajmniej na czas misji), więc pozostałe roboty nie mogą jej używać.

Do zaawansowanych:[]

To słowo kluczowe występuje także przy używaniu klas, ma wtedy podobne, ale nie to samo działanie.

Typ zwracanej wartości przez funkcje[]

Każda funkcja w programie musi zwracać wartość określonego w definicji typu. Może to być jakikolwiek typ fundamentalny lub złożony, na przykład int, string, object itd.

Czy funkcja może nic nie zwracać?[]

Teoretycznie zawsze będzie coś zwracać, ale praktycznie - odpowiedź brzmi: tak. Wystarczy podać jej typ void, który reprezentuje nic.

Zwracanie wartości przez funkcje[]

No dobrze, mamy typ zwracanej wartości, ale musimy przecież ją jakoś zwrócić! Robi się to w bardzo prosty sposób przy pomocy jednej linijki i instrukcji: return. Dokładny opis jej działania jest podany na stronie, tutaj chcę tylko zwrócić uwagę na kilka faktów:

  • Każda funkcja kończy się zwróceniem wartości, więc instrukcja return jest wymagana na końcu bloku każdej funkcji. Wyjątkiem są funkcje zwracające typ void.
  • Wynik działania funkcji może albo bezpowrotnie zniknąć, albo możemy (a wręcz powinniśmy, bo inaczej po co by była ta wartość) go zatrzymać przy pomocy używania funkcji w wyrażeniach.

Argumenty przyjmowane przez funkcję[]

To argumenty czynią z funkcji użyteczne narzędzia. Podajemy je w nawiasach, zaraz po nazwie funkcji i oddzielamy przecinkiem. Każdy argument musi mieć podany typ i nazwę.

void f(int argument1, int argument2)

Potem możemy korzystać z takich argumentów w kodzie funkcji przy pomocy ich nazw lokalnych.

int f(int argument1, int argument2)
{
if(argument1 > argument2)
  return argument1;
else return argument2;
}

Przekazywanie argumentów do funkcji jest również bardzo proste:

int n = 2;

f(1, n);

Jak widać możemy przekazać stałe dosłowne lub całe zmienne.

Ważne fakty o argumentach[]

  • Argumenty są nazwami obiektów lokalnych, dostępnymi jedynie w bloku funkcji.
  • Przekazywanie argumentów do funkcji odbywa się przez KOPIOWANIE wartości do lokalnych zmiennych automatycznych. Innymi słowy: Funkcja NIE może modyfikować wartości obiektów. Może co najwyżej zmienić wartość KOPII, która jest usuwana od razu po zakończeniu funkcji.
  • Wyjątkiem od powyższej reguły są tablice oraz klasy, ponieważ do ich instancji odwołujemy się przy pomocy wskaźników, które zachowują się trochę inaczej od zwykłych zmiennych. Sposób, w jaki ich używać, jest podany na stronach odnośnie tych pojęć.
Advertisement