Přejít na obsah

Modifikátory funkcí a proměnných [***]

tut tutorial samp pawn modifikátor stock public static const

  • Pokud chcete odpovědět, přihlaste se
Žádné odpovědi

#1
vEnd

vEnd

    Marc Wayne "B-Dup"

  • Globální moderátor
  • Příspěvků: 496
  • Je tu celkem: 46d 1h 51m 4s

Obtížnost: :3:
 
Osnova:
1. Úvod
2. Modifikátor(y)
3. const
4. public
5. static
6. stock
7. Závěr
 
1. Úvod
Zdraví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. const
Jako 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 b)
{
    printf("a = %i\nb = %i", a, b);

    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. public
Dosti 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 b); //prototyp veřejné funkce

public MyPrint(const a, const b) //deklarace veřejné funkce
{
    printf("a = %i\nb = %i", a, b);
}

.

5. static
Tř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. stock
A 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, že se daná proměnná/funkce nemá zkompilovat do AMX verze, pokud jsme ji nikde nepoužili. Takže, když vytvořím stock proměnnou/funkci a nikde v kódu ji nepoužiji, nejenže nebude zahrnuta v AMX, ale také mi 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ěr
A 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ý.


  • 3


96b259ac47244701b5097887d9439120.png

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
Roses are gay, violets are gayer, fuck the poem and listen to Slayer.
Unix is user friendly. It just happens to be very selective about who it decides to make friends with.






Také označeno jedním nebo více klíčovými slovy: Návod, tut, tutorial, samp, pawn, modifikátor, stock, public, static, const

0 uživatelů si prohlíží toto fórum

0 uživatelů, 0 návštěvníků 0 anonymních uživatelů

© 2015 IPS, Inc.

Zajímat Vás mohou ještě aktuální zprávy. sleviště, slevy dnes Herbalife je skvělou cestou pro dobré zdraví. Je libo dětský web?