colobot-data/help/P/cbot/function.txt.bak

86 lines
2.8 KiB
Plaintext

\b;Funkcje
Używając funkcji można podzielić program na kilka części, z których każda będzie wykonywała określone zadanie.
Wyobraźmy sobie następujący program¦:
\c;
\s;extern void object::Zdalnie( )
\s;{
\s; send("order", 1, 100);
\s; wait(5);
\s; send("order", 3, 100);
\s; wait(5);
\s; send("order", 2, 100);
\s; wait(5);
\s; send("order", 4, 100);
\s; wait(5);
\s;}
\n;
Instrukcje \c;send\n; i \c;wait\n; wykonywane są wielokrotnie. Byłoby dobrze utworzyć funkcję wykonującą te dwie instrukcje:
\c;
\s;void object::WyślijDoStacji( float op )
\s;{
\s; send("order", op, 100);
\s; wait(5);
\s;}
\s;extern void object::Zdalnie( )
\s;{
\s; WyślijDoStacji(1);
\s; WyślijDoStacji(3);
\s; WyślijDoStacji(2);
\s; WyślijDoStacji(4);
\s;}
\n;
Funkcja może mieć parametry¦:
\c;
\s;void Przykład( int a, float x, string s )
\n;
Funkcja \c;Przykład\n; dostaje jako parametry liczbę całkowitą \c;a\n;, liczbę zmiennoprzecinkową \c;x\n; oraz łańcuch \c;s\n;. Parametry są "przekazywane przez wartość", czyli są kopią wartości określonych jako zmienne podczas wywołania. Przy przekazaniu zmiennej \c;int\n; funkcji, jej parametr jest kopią wartości przekazanej jako argument, wobec czego funkcja może zmieniać wartość parametru bez zmiany wartości w miejscu, z którego była wywołana funkcja.
Przy przekazaniu instancji \l;klasy\u cbot\class; lub \l;tablicy\u cbot\array; jako parametru, funkcja otrzymuje jedynie \l;wskaźnik\u cbot\pointer; do instancji lub tablicy. Oznacza to, że w przypadku modyfikacji instancji lub tablicy wewnątrz funkcji, w rzeczywistości zostanie zmodyfikowana instancja lub tablica określona podczas wywołania.
Funkcja może również zwrócić wynik przy użyciu instrukcji \c;\l;return\u cbot\return;\n;. Jednakże powinna być wówczas zadeklarowana nie jako void, ale powinna mieć określony typ:
\c;
\s;float Średnia( float a, float b )
\s;{
\s; return (a+b)/2;
\s;}
\s;
\s;extern void object::Test( )
\s;{
\s; float wartość;
\s; wartość = Średnia(2, 6);
\s; message( wartość ); // wyświetli liczbę 4
\s;}
\n;
I jeszcze kilka przykładów¦:
\c;
\s;float Pi( )
\s;{
\s; return 3.1415;
\s;}
\s;
\s;string Znak( float a )
\s;{
\s; if ( a > 0 ) return "dodatnia";
\s; if ( a < 0 ) return "ujemna";
\s; return "zero";
\s;}
\n;
Można zadeklarować kilka funkcji o tej samej nazwie lecz o różnych parametrach¦:
\c;
\s;float Pitagoras( float a, float b )
\s;{
\s; return sqrt((a*a)+(b*b));
\s;}
\s;
\s;float Pitagoras( float a, float b, float c )
\s;{
\s; return sqrt((a*a)+(b*b)+(c*c));
\s;}
\n;
CBOT wywoła jedną z nich, w zależności od przekazanych parametrów.
Można też zadeklarować funkcję \l;publiczną\u cbot\public;, która będzie dostępna dla wszystkich robotów.
\t;Zobacz również
\l;Programowanie\u cbot;, \l;typy\u cbot\type; i \l;kategorie\u cbot\category;.