\b;Funkce
Stručně řečeno, funkce je příkaz, který jste si vytvořili sami.

\b;Hlavní funkce
Nejspíše už víte, jak funkci vytvořit. Každý program napsaný v CBOTu musí mít hlavní funkci, která vypadá takto:
\c;
\s;extern void object::NazevProgramu()
\s;{
\s;	
\s;	// příkazy
\s;	
\s;}
\n;
V hlavičce hlavní funkce můžete měnit pouze jméno. Klíčové slovo \c;\l;extern\u cbot\extern;\n; odlišuje hlavní funkci od ostatních funkcí.

\b;Základní použití
Své programy můžete pomocí funkcí rozdělit do více částí. Každá část bude provádět jeden dílčí úkol. Podívejte se například na následující program:
\c;
\s;extern void object::Ovladac()
\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;
Příkazy \c;\l;send\u cbot\send;\n; a \c;\l;wait\u cbot\wait;\n; se opakují několikrát dokola. Takže by se hodilo vytvořit funkci, která provede oba příkazy najednou:
\c;
\s;void PoslatPrikaz(float op)
\s;{
\s;	send("order", op, 100);
\s;	wait(5);
\s;}
\s;
\s;extern void object::Ovladac()
\s;{
\s;	PoslatPrikaz(1);
\s;	PoslatPrikaz(3);
\s;	PoslatPrikaz(2);
\s;	PoslatPrikaz(4);
\s;}
\n;
Tento program už je mnohem čitelnější. Doporučený postup je rozdělit větší program do více funkcí s názvem, který popisuje jejich činnost.

\b;Syntaxe
\c;
\s;návratový_typ NázevFunkce(volitelné_parametry)
\s;{
\s;	tělo
\s;}
\n;
Pokud funkce nemá vracet žádnou hodnotu, návratový \l;typ\u cbot\type; by měl být \l;void\u cbot\void;. Tělo funkce je prostě sada příkazů. Název funkce musí splňovat stejné podmínky jako název \l;proměnné\u cbot\var;.

\t;Parametry
Funkce může přijímat parametry:
\c;
\s;void Priklad(int a, float x, string s)
\s;{
\s;	message(a);
\s;	message(x);
\s;	message(s);
\s;}
\n;
Funkce \c;Priklad\n; bude dostávat \l;celé číslo\u cbot\int; \c;a\n;, \l;desetinné číslo\u cbot\float; \c;x\n; a \l;řetězec\u cbot\string; \c;s\n;. Parametry se předávají hodnotou, to znamená, že hodnoty parametrů uvnitř funkce jsou kopiemi hodnot, které volající kód zadal prostřednictvím jiných proměnných. Pokud funkci předáte hodnotu typu \c;\l;int\u cbot\int;\n;, parametr uvnitř funkce bude obsahovat kopii původní hodnoty zadané jako argument. Funkce může obsah svých parametrů libovolně měnit, aniž by tím ovlivnila obsah proměnných exitujících mimo ni.

Pokud funkci jako parametr předáte instanci \l;třídy\u cbot\class; nebo \l;pole\u cbot\array;, funkce dostane pouze \l;ukazatel\u cbot\pointer; na zadaný objekt. To znamená, že když uvnitř funkce změníte obsah předané instance nebo pole, změníte tím obsah původního objektu existujícího mimo funkci.

\t;Návratová hodnota
Funkce také může vracet návratovou hodnotu příkazem \c;\l;return\u cbot\return;\n;. V takovém případě musí být funkce deklarovaná s jiným návratovým \l;typem\u cbot\type; než \c;\l;void\u cbot\void;\n;:
\c;
\s;float Prumer(float a, float b)
\s;{
\s;	return (a+b)/2;
\s;}
\s;
\s;extern void object::Test( )
\s;{
\s;	float value;
\s;	value = Prumer(2, 6);
\s;	message(value);  // zobrazí hodnotu 4
\s;}
\n;
Pár dalších příkladů:
\c;
\s;float Pi()
\s;{
\s;	return 3.1415;
\s;}
\s;
\s;string Znamenko(float a)
\s;{
\s;	if (a > 0)  return "kladne";
\s;	if (a < 0)  return "zaporne";
\s;	return "nula";
\s;}
\n;

\b;Přetěžování
Můžete deklarovat více funkcí se stejným názvem, ale různými parametry:
\c;
\s;float Pythagoras(float a, float b)
\s;{
\s;	return sqrt((a*a)+(b*b));
\s;}
\s;
\s;float Pythagoras(float a, float b, float c)
\s;{
\s;	return sqrt((a*a)+(b*b)+(c*c));
\s;}
\n;
CBOT zavolá buď první, nebo druhou funkci podle zadaných parametrů. Funkce musejí být navzájem rozlišitelné, tedy nesmíte deklarovat dvě funkce se stejným názvem a stejnými typy parametrů ve stejném pořadí. Např. deklarace funkce \c;int Pythagoras(float b, float a)\n; vyvolá chybu. Všimněte si, že návratový typ nehraje roli.

\b;Veřejné funkce
Funkci také můžete deklarovat jako \l;public\u cbot\public; (veřejnou), aby ji mohli volat i ostatní roboti.

\b;object::
Když funkci deklarujete jako prvek jmenného prostoru \l;object\u cbot\object;, dáte jí tím přístup k \l;ukazateli\u cbot\pointer; \c;\l;this\u cbot\this;\n;, to znamená ke všem dostupným vlastnostem robota, na kterém program právě běží.
\c;
\s;void object::Priklad()
\s;{
\s;	message(this.category);
\s;}
\n;

\b;Výchozí parametry
Parametrům na konci seznamu můžete zadat výchozí hodnotu, která se použije, kdež je při volání funkce nevyplníte.
\c;
\s;float Add(float a = 0.0, float b = 0.0)
\s;{
\s;	return a + b;
\s;}
\s;
\s;// Někde v hlavním programu...
\s;Add(); // Vrátí 0.0
\s;Add(2.0); // Vrátí 2.0
\s;Add(2.0, 3.0); // Vrátí 5.0
\s;// ...
\n;

\t;Výchozí parametry a přetěžování
Funkce s výchozími parametry můžete normálně přetěžovat, jen si musíte dávat pozor, aby různé způsoby volání zůstaly jednoznačné. Například si představte následující kód:
\c;
\s;float Add(float a = 0.0, float b = 0.0)
\s;{
\s;	return a + b;
\s;}
\s;
\s;string Add(string a = "", string b = "")
\s;{
\s;	return a + b;
\s;}
\s;
\s;// Někde v hlavním programu...
\s;Add(); // Chyba kompilace: nejednoznačné volání
\s;Add(""); // OK
\s;Add(0.0); // OK
\s;// ...
\n;
Všimněte si, že v předchozím příkladu je výchozí hodnota pro první parametr k ničemu, protože při volání funkce musíte vždy zadat alespoň jeden parametr, abyste určili, která varianta funkce se má zavolat.

\t;Užitečné odkazy
\l;Programování\u cbot;, \l;datové typy\u cbot\type; a \l;kategorie\u cbot\category;.
