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
8 odpovědí

#1
vEnd

vEnd

    Python maniac

  • Globální moderátor
  • Příspěvků: 682

*
POPULÁRNÍ

Obtížnost: 3.png
 
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, 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ě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ý.


  • 8


I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
It's hard to follow the train when you are hauling two number nines; a number nine large; a number six with extra dip; a number seven; two number 45s, one with cheese; and a large soda. -guess who


#2
Tanga

Tanga

    Dieta internetu

  • Uživatel
  • Příspěvků: 1 142

Uživatelova ocenění

        

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

“The only Zen you find on the tops of mountains is the Zen you bring up there.” ~Robert M. Pirsig

 

96b259ac47244701b5097887d9439120.png

 

Ku kódu nezabudnite priložiť SSCCE.

Spoiler

#3
vEnd

vEnd

    Python maniac

  • Globální moderátor
  • Příspěvků: 682

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.


  • 0

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
It's hard to follow the train when you are hauling two number nines; a number nine large; a number six with extra dip; a number seven; two number 45s, one with cheese; and a large soda. -guess who


#4
Quiter

Quiter

    Emmet

  • Uživatel
  • Příspěvků: 652

Podľa mňa veľmi poučný návod, úprimne, mnoho z toho som nevedel :d

 

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?


  • 0
__________________________________________________________________________
Nikdy nehovor, že sa niečo nedá, pretože vždy sa nájde nejaký de*il, ktorý nevie že sa to nedá a urobí to!

#5
vEnd

vEnd

    Python maniac

  • Globální moderátor
  • Příspěvků: 682

Podľa mňa veľmi poučný návod, úprimne, mnoho z toho som nevedel icon_e_biggrin.gif

 

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í

  • 0

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
It's hard to follow the train when you are hauling two number nines; a number nine large; a number six with extra dip; a number seven; two number 45s, one with cheese; and a large soda. -guess who


#6
Tanga

Tanga

    Dieta internetu

  • Uživatel
  • Příspěvků: 1 142

Uživatelova ocenění

        

Podľa mňa veľmi poučný návod, úprimne, mnoho z toho som nevedel icon_e_biggrin.gif

 

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.
:kappa:


  • 0

“The only Zen you find on the tops of mountains is the Zen you bring up there.” ~Robert M. Pirsig

 

96b259ac47244701b5097887d9439120.png

 

Ku kódu nezabudnite priložiť SSCCE.

Spoiler

#7
Quiter

Quiter

    Emmet

  • Uživatel
  • Příspěvků: 652

 

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ť icon_e_sad.gif

 

 

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.
kappa.png

Á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.
kappa.png

 

Upraveno uživatelem Quiter: 04 květen 2017 - 13:00:52

  • 1
__________________________________________________________________________
Nikdy nehovor, že sa niečo nedá, pretože vždy sa nájde nejaký de*il, ktorý nevie že sa to nedá a urobí to!

#8
ATomas

ATomas

    RZE for life, SP for ever !

  • Ověřený uživatel
  • Příspěvků: 2 821
  •   

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)


Upraveno uživatelem ATomas: 21 květen 2017 - 23:07:10

  • 0
play.superparba.eu:7777
www.superparba.eu
pawno.cz kazí dva typy lidí:
1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví
2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.

#9
vEnd

vEnd

    Python maniac

  • Globální moderátor
  • Příspěvků: 682

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.


  • 0

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
It's hard to follow the train when you are hauling two number nines; a number nine large; a number six with extra dip; a number seven; two number 45s, one with cheese; and a large soda. -guess who






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?