Hlavní moderátor Popular Post vEnd 279 Odesláno: 3. Květen, 2017 Hlavní moderátor Popular Post Share Odesláno: 3. Květen, 2017 Obtížnost: Osnova:1. Úvod, co je to funkce;2. Definice funkce a její části;3. Parametry; 4. Návratová hodnota; 5. Závěr. 1. Úvod, co je to funkce Zdravím, tímto návodem konečně dokončím šňůru návodů pro začátečníky. Posledním tématem, které jsme ještě nestihli probrat, jsou funkce. O čem je řeč? Funkce jsou takové části kódu, které lze volat v různých částech skriptu. Někdy se lze také setkat s pojmem podprogram (ačkoliv to není to samé – podprogramem mohou být i metody, ale to se nás ani Pawn netýká). Účel je jasný – abychom nemuseli psát tentýž kód na více místech, napíšeme jej jen jednou a voláme jej tam, kde potřebujeme. Přináší nám to hned několik benefitů – kratší a přehlednější kód, při úpravě kódu jej stačí upravit na jednom místě, totéž platí pro opravy chyb. Počas skriptování SA:MP skriptů se setkáváme s funkcemi nepřetržitě, jmenovitě například funkce GetPlayerName, SendClientMessage, strval, ale i OnPlayerConnect či OnFilterScriptInit. 2. Definice funkce a její části Když už máme představu, co to funkce je, měli bychom si ukázat, jak ji vytvořit. Každá funkce má svůj název (identifikátor), dále pak parametry, o kterých si řekneme za chvíli, tělo, do kterého vkládáme kód, a jako poslední návratovou hodnotu (i když tu nemusí mít nezbytně, o tom za chvíli). Ukažme si to na kódu: Secist(cislo1, cislo2) { new suma; suma = cislo1 + cislo2; return suma; } Teď si určíme jednotlivé části funkce: – identifikátor: Secist – parametry: cislo1 a cislo2 – tělo funkce: všechno mezi složenými závorkami {} – návratová hodnota: return suma; Jak je vidět, jako první se uvádí identifikátor, poté následují parametry ohraničené kulatými závorkami, následně se píše tělo kódu do složených závorek a do těla se uvádí návratová hodnota příkazem return. Výše uvedená funkce slouží k součtu dvou celých čísel. 3. Parametry Díky parametrům můžeme funkci předávat vstupní hodnoty a/nebo ovlivňovat to, jak se bude chovat. U naší sčítací funkce parametry slouží k předání sčítanců. Ale například funkce strcmp má parametr ignorecase, který nám určuje, zda má funkce ignorovat rozdíl mezi velkými a malými písmeny. Tento parametr ovlivňuje chování funkce. Parametry funkcí v Pawn mohou být různého datového typu (tedy celá čísla, desetinná čísla, logické hodnoty, řetězce atd.) a může jich být libovolný počet. Jsou funkce, které nemají žádné parametry (kulaté závorky ale musíme uvést vždy – ()), jsou takové, které jich mají i 10. Zde je pár funkcí na ukázku, každá s jiným počtem parametrů (všechny lze dohledat na SA:MP wiki): GetTickCount(); //funkce bez parametrů SendClientMessage(playerid, color, const message[]); //funkce se 3 parametry AddPlayerClass(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo); //funkce s 11 parametry Lze si všimnout, že u některých se objevují věci jako Float:, [] apod. Právě tyto, prozatím tomu říkejme "věci", nám určují, jaký datový typ bude daný parametr mít. Seznam nejčastěji používaných datových typů: playerid // když neuvedeme nic, bere to jako celé číslo Float:x // Float: nám značí desetinné číslo bool:ignorecase // bool: nám značí logickou hodnotu (true/false) message[] // hranaté závorky znamenají řetězec (nebo pole, viz předchozí návody) Zbývá nám uvést si, jak takové parametry dosazovat při volání funkce. Jednoduše za ně dosadíme skutečné hodnoty (přesněji argumenty) v tom pořadí, v jakém jsme je definovali: GetTickCount(); //nic se nemění SendClientMessage(0, 1, "Ahoj, světe!"); //dosazení argumentů (skutečných hodnot) Nad rámec návodu (pro zvídavé): Pokud víme, že bude za parametr často dosazována konkrétní hodnota, můžeme mu určit výchozí hodnotu. Při volání funkce se to projeví tak, že pokud chceme použít výchozí hodnotu, parametr neuvádíme. Chceme-li zadat jinou hodnotu, nic se nemění – zkrátka ji zadáme. Dříve zmíněná funkce strcmp má 2 parametry s výchozí hodnotou – ignorecase a length. Tuto funkci je tedy možné volat bez nich, pokud chceme zachovat jejich výchozí hodnoty, nebo s nimi, pokud chceme hodnoty změnit, viz příklad: strcmp("Ahoj", "Hello"); // nechali jsme parametrům výchozí hodnoty strcmp("Ahoj", "Hello", true); // změnili jsme výchozí hodnotu parametru ignorecase strcmp("Ahoj", "Hello", true, 2); // změnili jsme výchozí hodnotu oběma parametrům A jak vypadá definice funkce s výchozími parametry? Tak, že parametrů přiřadíme hodnotu operátorem přirazení (rovnítko). Mějme ale na paměti, že takové parametry musí být vždy na konci! Soucet(cislo1, cislo2=0) //parametr cislo2 má výchozí hodnotu 0, a tudíž musí být na konci { new suma; suma = cislo1 + cislo2; return suma; } 4. Návratová hodnota Na začátku jsme řekli, že funkce má také návratovou hodnotu. Přesněji řečeno, může mít, ale nemusí. Přesně tak, funkce žádnou návratovou hodnotu mít nemusí. V některých jazycích se pak funkce bez návratové hodnoty nazývá procedurou. V kódu naší sčítací funkce je vidět, že hodnotu vrátíme příkazem return. Ve funkci můžeme tento příkaz použít vícekrát (často to souvisí s podmínkami a větvením), ale pravidlem je, že musí vždy vrátit hodnotu stejného datového typu. Kompilátor nám neumožní vrátit jednou celé číslo a jednou řetězec, to prostě nejde. Když už jsme zmínili datové typy, je třeba si dávat pozor na jednu věc. Pokud vracíme hodnotu jinou než celé číslo či řetězec, musíme před identifikátor uvést příslušný tag (teď už nepíši "věc", ale tag). Upravme si tedy naši funkci pro sčítání dvou desetinných čísel: Float:Secist(Float:cislo1, Float:cislo2) // před názvem nám přibyl tag Float { new Float:suma; suma = cislo1 + cislo2; return suma; } Zde je vidět, že před názvem nám přibylo Float:. Je to nutné pro správný chod funkce. Kdybychom vraceli např. logické hodnoty, byl by tam tag bool:. A jak je to tedy s funkcemi (procedurami, jestli chcete), které nic nevracejí? Jsou dvě možnosti, buď uvedeme prázdný return – return; – nebo neuvedeme nic. Je to jen na vás, běžná je druhá varianta (neuvádět nic). Ukázka: Vypis(const message[]) { print(message); return; } Vypis2(const message[]) { print(message); } 5. Závěr A tím jsme se dostali jak k závěru tutoriálu, tak k závěru celé série. Děkuji všem, kteří si návod přečetli, a obdivuji všechny, kteří prošli celou sérií. Doufám, že jste se dozvěděli něco nového, pokud ne, alespoň jste si to zopakovali. Prozatím neplánuji začínat další sérii návodů, ale je možné, že se sem tam něco objeví. Ještě jednou děkuji a platí to, co vždycky – pokud jste našli nějakou chybu či nesrovnalost nebo se jen chcete na něco zeptat, zanechte mi vzkaz pod tímto příspěvkem. 6 Link to comment Share on other sites More sharing options...
Quiter 99 Odesláno: 4. Květen, 2017 Share Odesláno: 4. Květen, 2017 Ešte dodám, že si zabudol uviesť ako upraviť hodnotu viacerych premenných pomocou 1 funkcie zmena_hodnot(a, &b, &c, &d) { b = a * a; c = a * a *a; d = a * a *a * a; a = 14; // úplne zbytočné, dávam len ako ukážku, že to neovplivní "vonkajšiu" premennú } new A = 5, B = 3, C = 17, D = 19; /* A je teraz 5 B je teraz 3 C je teraz 17 D je teraz 19 */ zmena_hodnot(A, B, C, D); /* A je stále 5 (pretože sme vo funkcii pri tomto parametri nepoužili &) B je 25 (5 * 5, 5 na 2) C je 125 (5 na tretiu) D je 625 (5 na štvrtú) */ Bohužiaľ neviem ako sa to volá po odbornej stránke Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 4. Květen, 2017 Author Hlavní moderátor Share Odesláno: 4. Květen, 2017 Ešte dodám, že si zabudol uviesť ako upraviť hodnotu viacerych premenných pomocou 1 funkcie zmena_hodnot(a, &b, &c, &d) { b = a * a; c = a * a *a; d = a * a *a * a; a = 14; // úplne zbytočné, dávam len ako ukážku, že to neovplivní "vonkajšiu" premennú } new A = 5, B = 3, C = 17, D = 19; /* A je teraz 5 B je teraz 3 C je teraz 17 D je teraz 19 */ zmena_hodnot(A, B, C, D); /* A je stále 5 (pretože sme vo funkcii pri tomto parametri nepoužili &) B je 25 (5 * 5, 5 na 2) C je 125 (5 na tretiu) D je 625 (5 na štvrtú) */ Bohužiaľ neviem ako sa to volá po odbornej stránke Je to předávání parametru odkazem (angl. passed by reference), a máš pravdu, na to jsem zapomněl, díky. Dnes to doplním. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now