Hlavní moderátor Popular Post vEnd 279 Odesláno: 18. Srpen, 2016 Hlavní moderátor Popular Post Share Odesláno: 18. Srpen, 2016 Obtížnost: Osnova:1. Úvod2. Modifikátor(y)3. const4. public5. static6. stock7. Závěr 1. ÚvodZdravím Vás u, tentokrát o něco náročnějšího, návodu z oblasti jazyka Pawn. Krátce jsem přerušil svou sérii návodů pro začátečníky a sepsal tento návod, který se týká modifikátorů funkcí a proměnných. Jde se na věc. 2. Modifikátor(y)Začněme s tím, oč vlastně jde. Modifikátor nám představuje nějaké klíčové slovo, které upravuje (modifikuje) vlastnosti funkce/proměnné. Mohou se uvádět samostatně, ale i v kombinaci s jinými modifikátory. V tomto návodu se zaměříme na 4 modifikátory, a to na const, public, static a stock. 3. constJako první začneme s modifikátorem const. Jeho účel se dá domyslet, je to totiž zkratka pro constant (konstantní), ale aby to bylo jasné – jeho účelem je tvořit tzv. konstantní proměnné, popř. konstantní parametry funkcí. Ano, tento modifikátor se nedá použít u definice funkce. Jeden by si řekl, že pojem "konstantní proměnná" je blbost (vlastně je to oxymóron, ale literární teorii dáme zase jindy). Jak může být proměnná konstantní? No, světě div se, ale může. Takovéto proměnné (nebo poli/řetězci) lze určit hodnotu jen při deklaraci (aneb inicializace). Vypadá to následovně: . new const max = 10; //určili jsme konstantní proměnné "max" hodnotu 10 new const rankNames[3][20+1] = {"Hráč", "Moderátor", "Administrátor"}; //konstantní pole řetězců s názvy hodností . Po tomto už nebudeme moci nikde hodnotu proměnné/pole změnit, kompilátor by nám nahlásil chybu. new před modifikátorem lze vynechat, ale pouze u proměnných, pole/řetězce to vyžadují. Pak jsem také zmínil cosi jako konstantní parametr funkce. Aniž byste to věděli, už jste se s tím setkali, a to u řetězcových funkcí: . strlen(const string[]) //konstantní parametr "string[]" . Zpravidla to vídáme u řetězců, ale lze to aplikovat i na ostatní parametry. A co nám to způsobí? Způsobí to, že daný parametr bude jen pro čtení. To znamená, že ho nelze uvnitř funkce přepisovat. . MyPrint(const a, const { printf("a = %i\nb = %i", a, ; a++; //tento řádek by hodil chybu, "a" je jen pro čtení b = 0; //tento řádek by taky hodil chybu, i "b" je jen pro čtení } . 4. publicDosti zajímavým modifikátorem je public. Ačkoliv jej lze použít i na proměnnou, smysl to má jen u funkcí. S "veřejnými" funkcemi se nejčastěji setkáváme u SA:MP callbacků a časovačů. Na jakém principu ale tyto funkce pracují a co nám přinášejí? Funkce s modifikátorem public SA:MP server volá přímo, proto jsou v AMX souboru zapsány čitelně (narozdíl od běžných funkcí, které mají v AMX zapsány svou adresu). To s sebou přináší velkou výhodu – lze je volat ve všech scriptech i v módu. Když si tedy ve svém módu vytvořím veřejnou funkci, mohu ji zavolat ve scriptech, což mi normální funkce neumožňuje. K tomuto meziscriptovému volání slouží funkce CallRemoteFunction. Nutno ale dodat, že veřejné funkce mají také svá omezení. Ty jsou následující:– každá veřejná funkce musí mít svůj prototyp (klíčové slovo forward);– veřejné funkce nemohou mít parametry s výchozí hodnotou;– veřejné funkce nemohou vracet řetězce. Její využítí spočívá zejména v již zmíněném sdílení mezi scripty. Také ji musíme využít v případě časovačů (SetTimer, SetTimerEx) a SA:MP callbacků (OnPlayerConnect apod.). Definice veřejné funkce vypadá takto: . forward MyPrint(const a, const ; //prototyp veřejné funkce public MyPrint(const a, const //deklarace veřejné funkce { printf("a = %i\nb = %i", a, ; } . 5. staticTřetím na řadě je modifikátor static. U tohoto klíčového slova je zajímavé to, že se jeho účel liší u lokální proměnné a u globální proměnné / funkce. U lokální proměnné nám static může nahradit globální proměnnou. Zachovává si totiž svou hodnotu i po ukončení bloku. Názorná ukázka: . MyFunc() { static a; a++; } for(new i; i<3; i++) //3x volám funkci "MyFunc" { MyFunc(); } . Kdybychom proměnnou "a" deklarovali pomocí new, hodnota by se pokaždé vynulovala, jakmile by funkce došla ke konci. Jenže statická proměnná "a" si svou hodnotu zachová i po dokončení funkce, takže její hodnota bude po třech zavoláních 3. Co se týče statické globální proměnné a statické funkce, jejich funkce je odlišná. Když takovou globální proměnnou / funkci deklarujeme, je platná pouze v daném souboru. Co to znamená? Řekněme, že máme knihovnu mylib.inc, kterou připojujeme ke scriptu myscript.pwn. . //mylib.inc new a = 5; MyFunc() print("Hello, world!"); //myscript.pwn #include <mylib> new a = 3; MyFunc() print("Ahoj, světě!"); . Tento kód nám zahlásí chybu, že symbol "a" a "MyFunc" již existuje. Proč? Protože nemůžeme mít stejné identifikátory v knihovně i ve scriptu. Pokud tedy nepoužijeme statickou globální proměnnou / funkci: . //mylib.inc static a = 5; static MyFunc() print("Hello, world!"); //myscript.pwn #include <mylib> new a = 3; MyFunc() print("Ahoj, světě!"); . Teď je vše v pořádku. Proč? Protože jsme v knihovně použili modifikátor static, čímž jsme jazyku sdělili, že tyto názvy jsou platné jen v té knihovně, ve scriptu už ne. Tohle je opravdu šikovná utilitka, která se při tvorbě knihoven hodí. 6. stockA teď se dostáváme k mému favoritovi – k modifikátoru stock. Nevím, proč se to tak ustálilo (asi nadměrným používáním), ale mnozí si ještě dodnes myslí, že stock je synonymum pro funkci. Není, lidi, NENÍ! Jako každý jiný, tak i modifikátor stock má své specifické využití. A toto využití lze aplikovat jak na funkce, tak na proměnné. V čem to tedy je? Když u proměnné/funkce použijeme stock, říkáme tím kompilátoru, aby nám nevyhazoval varování o tom, že funkci nikde nevoláme. Takže, když vytvořím stock proměnnou/funkci a nikde v kódu ji nepoužiji, nebude kompilátor hlásit varování "symbol is never used". To je vše, to je celé kouzlo tohoto modifikátoru. Pro úplnost ještě deklarace: . stock a = 3; //stock proměnná stock MyFunc() //stock funkce { print("Hello, world!"); } . 7. ZávěrA tím se dostáváme ke konci. Doufám, že jsem Vás něčemu novému přiučil, o stock a static toho lidé většinou moc neví, tak teď mají možnost se to dozvědět dopodrobna. Jak už bylo zmíněno na začátku, modifikátory lze kombinovat, např. static v kombinaci s const lze najít v některých knihovnách (nejen) od Y_Lesse. Zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený. 8 Link to comment Share on other sites More sharing options...
Tanga 131 Odesláno: 3. Květen, 2017 Share Odesláno: 3. Květen, 2017 V čem to tedy je? Když u proměnné/funkce použijeme stock, říkáme tím kompilátoru, že se daná proměnná/funkce nemá zkompilovat do AMX verze, pokud jsme ji nikde nepoužili. To som si tky myslel, ale som to otestoval práve a ukázalo sa, že ani stock ani obyčajná funkcia (ani premenné) sa neskompilujú ak ich nepoužiješ.Akurát obyčajná premenná ti hodí warning, že je nepoužitá, kdežto stock potichu zmizne. 2 Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 3. Květen, 2017 Author Hlavní moderátor Share Odesláno: 3. Květen, 2017 To som si tky myslel, ale som to otestoval práve a ukázalo sa, že ani stock ani obyčajná funkcia (ani premenné) sa neskompilujú ak ich nepoužiješ. Akurát obyčajná premenná ti hodí warning, že je nepoužitá, kdežto stock potichu zmizne. Jop, to je pravda. 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 Podľa mňa veľmi poučný návod, úprimne, mnoho z toho som nevedel Ak správne chápem, tak keď použijem napr. dcmd (alebo zcmd) a premennú params ovplivním stock-om, tak mi nebude hlásiť chybu ak ju nepoužijem? COMMAND:mycommand(playerid, stock params[]) { return 1; } Alebo sa mýlim? 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 Podľa mňa veľmi poučný návod, úprimne, mnoho z toho som nevedel Ak správne chápem, tak keď použijem napr. dcmd (alebo zcmd) a premennú params ovplivním stock-om, tak mi nebude hlásiť chybu ak ju nepoužijem? COMMAND:mycommand(playerid, stock params[]) { return 1; } Alebo sa mýlim? 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í Link to comment Share on other sites More sharing options...
Tanga 131 Odesláno: 4. Květen, 2017 Share Odesláno: 4. Květen, 2017 Podľa mňa veľmi poučný návod, úprimne, mnoho z toho som nevedel Ak správne chápem, tak keď použijem napr. dcmd (alebo zcmd) a premennú params ovplivním stock-om, tak mi nebude hlásiť chybu ak ju nepoužijem? COMMAND:mycommand(playerid, stock params[]) { return 1; } Alebo sa mýlim? Ak sa chceš vyhnúť #pragma unused params za každú cenu, môžeš to ešte skombinovať s variabilnym počtom parametrov (tu). Tam ti nebude hlásiť, že si niečo z toho nepoužil. 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 (upraveno) 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í Nedalo mi to a tak som to vyskúšal. Nejde to tak použiť Ak sa chceš vyhnúť #pragma unused params za každú cenu, môžeš to ešte skombinovať s variabilnym počtom parametrov (tu). Tam ti nebude hlásiť, že si niečo z toho nepoužil. Áno, to viem, len ma tak napadla tamtá vec po prečítaní toho článku Ak sa chceš vyhnúť #pragma unused params za každú cenu, môžeš to ešte skombinovať s variabilnym počtom parametrov (tu). Tam ti nebude hlásiť, že si niečo z toho nepoužil. Edited 4. Květen, 2017 by Quiter 1 Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 21. Květen, 2017 Share Odesláno: 21. Květen, 2017 (upraveno) Jen poznamka k tomu stock. Ano compilator nevyhodi hlasku ze jsi to nepouzil a zaroven to danou funkci/promenou nezahrne do kompilovaneho kodu amx (tedy zmensi celkovou velikost vysledneho strojoveho kodu) Edited 21. Květen, 2017 by ATomas Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 21. Květen, 2017 Author Hlavní moderátor Share Odesláno: 21. Květen, 2017 Jen poznamka k tomu stock. Ano compilator nevyhodi hlasku ze jsi to nepouzil a zaroven to danou funkci/promenou nezahrne do kompilovaneho kodu amx (tedy zmensi celkovou velikost vysledneho strojoveho kodu) To som si tky myslel, ale som to otestoval práve a ukázalo sa, že ani stock ani obyčajná funkcia (ani premenné) sa neskompilujú ak ich nepoužiješ. Akurát obyčajná premenná ti hodí warning, že je nepoužitá, kdežto stock potichu zmizne. 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