Jump to content

vEnd

Hlavní moderátor
  • Příspěvků

    772
  • Registrován

  • Aktivní

  • Vítězných dnů

    60

Everything posted by vEnd

  1. vEnd

    návod #9 Funkce [**]

    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.
  2. Nezkoušel jsem to, každopádně si myslím, že takhle to fungovat nebude. U parametrů funguje modifikátor const, ale o stocku pochybuji. Každopádně lze to užít u funkce (známe) a proměnné: stock var; //nikde ji nepoužiji, varování se neobjeví
  3. Teď už je to o něco jasnější. Podařilo se vám Polise zastihnout? Zkoušel jsem mu psát na Skype, ale bez odpovědi.
  4. 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é): 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.
  5. Abych to chápal, takže ty se na tom též podílíš? Měl bys představit celý vývojářský tým, ať v tom máme jasno.
  6. Máš nejnovější verzi knihoven?
  7. Pokud vím, tak Polis chodí do školy také. Nevím, jestli zrovna od osmi do třinácti, ale moc se to lišit nebude. (Btw Deniska nemá cenu brát vážně.) Očividně na to hodně lidí čekalo, tak by to chtělo alespoň oficiální vyjádření o tom, že se to odsouvá.
  8. vEnd

    nabízím Bytovky v SF

    Soubory smazány Vzhledem k důkazům, které mi byly poskytnuty soukromě, jsem se rozhodl vyhovět Tomášově žádosti a soubory smazat. Autora tématu žádám, aby je na tomto fóru dál nešířil. Děkuji.
  9. Můžeš mi říct, proč nevložíš kód do části, trefně nadepsanou Kód, která je, světě div se, určená pro kód? Vidím to tady stále, moderátoři na to již několikrát upozorňovali, ale děje se to stále dokola. Dnes to upravuji naposledy, od příště už se podobné téma maže.
  10. vEnd

    nabízím Bytovky v SF

    Když mluvíš o podílu, myslíš vlastnický podíl? Pokud jste to kupovali dva a jeden z vás to poslal dál, tak s tím moc dělat nemůžeme. InParadise, tvé vyjádření k věci by se taky hodilo.
  11. vEnd

    nabízím Bytovky v SF

    Má-li se tohle řešit, potřebujeme vědět, jak to máte. Dělal jsi to dané osobě na zakázku? Jak se k tomu dostal? Pokud jsi to dříve vydával volně, pod jakou licencí?
  12. vEnd

    pomoc Pomoc! :)

    Špatná sekce Žádosti o pomoc (obzvláště ty s názvem "Pomoc") patří do sekce Pomoc, ne Scripty. Opravdu je to tak složité uvědomit si to?
  13. Být to PHP, mohlo by strval vracet false a použil bys jednoduše operátor ===, tady to holt vrací nulu jak pro strval("0"), tak pro strval("asdf"). Zas ale nemůžu chtít zázraky od jazyka, který datové typy nerozeznává (o tagech Float, bool apod. nemluvme). Jinak návod je v pohodě. Aktuální návody pro tento a podobné systémy tu momentálně nejsou (alespoň co vím), takže se to hodí. Ty z roků 2008 a 2010 už akorát přidělávají práci helperům, kteří pak musí opravovat zastaralé kódy.
  14. vEnd

    ostatní Diskuse na téma ... ryba

    https://www.youtube.com/watch?v=SiUz_akTmcY
  15. vEnd

    ostatní Diskuse na téma ... ryba

    Měli bychom zavést soutěž o nejlepší příspěvky. Na tohle je reputace krátká.
  16. vEnd

    ostatní Diskuse na téma ... ryba

    Chceš to zkusit? Alespoň bychom odzkoušeli, kam až mohou dosáhnout a jak by se k tobě dostali, až bys to odmítnul. Jestli vůbec.
  17. vEnd

    ostatní [ANKETA] - Speedometer

    Z praktického hlediska je lepší ten Danielsům, protože je čitelnější. Ty stíny v eXpresSově verzi jsou opravdu otřesné.
  18. vEnd

    script Rádio Systém 1.0

    Má to správně. Ačkoliv by skutečně mohl použít switch, použití if - else if - else if - ... - else je univerzální náhrada switche (některé jazyky switch nemají, třeba Python). Kdyby to nahradil jen za if, zbytečně by se porovnávaly další podmínky po nálezu té správné. Sérii if by mělo smysl použít tehdy, když by každý blok ukončoval příkazem return či break/continue (v cyklech).
  19. No, myslím, že hlavním důvodem amx je, aby to bylo lépe zpracovatelné serverem (asi jak bytecode v Javě). Ochrana proti přepsání či kopírování už je jen jaksi vedlejší efekt či sekundární záležitost, určitě to tak nevyvíjeli kvůli tomu. Jinak má ale mattyarts pravdu, pokud chceš něco přidat, učiň tak formou FS. Pokud chceš upravovat přímo části GM, máš bohužel smůlu.
  20. Můžeš nám ukázat, jak tu funkci voláš, a co myslíš tím "Vracia hodiny CZ / SK / EN"? Z toho, co jsi napsal, mi není nějak jasné, s čím máš vlastně problém.
×
×
  • Create New...