[TUTORIAL]Osnovne skriptanja

Evo malo sam gledao SA:MP wiki i odlučio sam probati prevesti si na hrvatski da bi moga bolje razumjeti sve to. Na kraju sam preveo cijelu SA:MP wiki stranicu sa osnovama skriptanja i stavio u PDF kao knjigu, pa sam ju evo odlučio podjeliti s vama. Ima 17 stranica i nije profesionalno prevedeno, ali mislim da se većina stvari može razumjeti.  ;D 

MediaFire link ovdje

Evo i cijeli tutorijal u postu(NAPOMENA: ovi brojevi koji su prvi u redovima su brojevi redova da nebi bilo zabune):

Osnove skriptanja

Izvor: SA:MP Wiki
Preveo i prilagodio: CroNiXer

Uvod

Prvo što se trebate upitati je što je zapravo skriptanje, pawn i pawno.

Skriptanje je kao programiranje samo što sa programskim jezicima vi možete izraditi cijeli sistem za računalo poput Windowsa, a skript jezici služe za programiranje tj. Skriptanje samo unutar nekog programa, u ovom slučaju skriptamo za program tj. igru SA:MP.

Pawn je skript jezik koji mi koristimo u SA:MP-u, vrlo je sličan C programskom jeziku.

Pawno je editor za skriptanje u Pawn skript jeziku, on je najjednostavniji i najstariji Pawn editor kojeg koriste SA:MP skripteri i može ga se skinuti na Internetu ili možete skinuti SA:MP server i dobit će te ga u mapi(NAPOMENA: Pawno se ne preporučuje za velike gamemodove jer se teško snalazi u njemu!).

E pa sad kad smo naučili osnovne pojmove možemo početi sa osnovama.

Započnimo

U nastavku se nalazi primjer najjednostavnijeg koda:

Pawn: [Odaberi]
1 #include <a_samp>2
3 main()
4 {
5 print("Zdravo svijete!");
6 return 1;
7 }

Detaljno ćemo obraditi sve redove no sada počinjemo sa prvim redom.

Include datoteke(Učitavači)

Pawn: [Odaberi]
1 #include <a_samp>
To u osnovi učitava kod iz „pawno/includes/a_samp.inc“  datoteke u vašu skriptu, pa sve što ima možete koristiti. Neke od stvari koje ima su:

Pawn: [Odaberi]
1 #include <core>2 #include <float>3 #include <string>4 #include <file>5 #include <time>6 #include <datagram>7 #include <a_players>8 #include <a_vehicles>9 #include <a_objects>10 #include <a_sampdb>
Ovo uključuje i sve ostale datoteke u taj direktorij, tako da, dodajući jednu liniju imate pristup svim funkcijama u SA:MP-u (više o funkcijama kasnije).

Calls(Pozivi)

Sljedeći dio ima dvije strane funkcijskog poziva. „main ()“ je funkcija za koju pišete u kod te je pozvana iz nekog drugog mjesta, „print(string[])“ je funkcija sa kodom na nekom drugom mjestu koju vi zovete. Trenutno sve što će ovo napraviti je učitati, sprintati „string“ tj. Vaš tekst (primjer prikazivanja-  „Zdravo svijete“ (bez navodnika)(tradicija u svim „scripting“ jezicima)) u konzolu servera i završi. Sljedeći dio koda je:

Pawn: [Odaberi]
6 return 1;
Dodaje vrijednost (1) natrag na mjesto koje je pozvalo „main“ da mu kaže što se dogodilo(točna vrijednost dodana ovdje ne smeta, ali u drugim mjestima smeta). Sada imate svoju prvu(najjednostavniju) skriptu. Ako odaberete „file->new“ u pawn editoru dati će vam mnogo veću početnu točku sa svim ponovnim pozivima(callbacks) unutra, uključujući i „main“ koji tehnički nije „callback“ no ponaša se kao jedan.

Statements(Izjave)

„Print“ i „return“ linije imaju „ ; “(točku-zarez) na kraju, to samo označava kraj izjave(izjava je skupina s jednom ili više funkcija i operatora koji zajedno rade nešto, slično kao rečenica u hrvatskom jeziku). Većina ljudi razdvajaju izjave ili tvrdnje u više redova no to nije potrebno, to samo čini stvari jasnije, slijedeća jednako vrijedi:

Pawn: [Odaberi]
1 main() { print("Zdravo svijete!")return 1; }
Vitičaste zagrade(„{}“) prilažu skupinu izjava ili tvrdnji koje bi trebale biti izvršene zajedno(kao stavak u hrvatskom jeziku). Ako ste napisali:

Pawn: [Odaberi]
1 main() print("Zdravo svijete!")return 1;
Da kompilate ovaj kod iznad dobili biste error, jer sada „return 1;“ izjava nije u skupini, a to znači da nije dio „main“. Spaja skupinu sa setom izjavi u jednu izjavu (zvana složena izjava) i funkcije imaju jednu izjavu sa njima. Bez spajanja „print“ i „return“ su u potpunosti odvojene izjave pa znači da su dvije pa, kao funkcija može imati samo jednu izjavu, ova druga nije funkcija, koja ne može biti kod.

Funkcije

Funkcija je u osnovi komad koda koji radi nešto i može mu se reći da to nešto učini od negdje drugdje. On također može prenijeti podatke o tome što je učinio nazad na mjesto koje mu je reklo da se pokrene (mjesto koje ga je"pozvalo").

Calling(pozivanje)

Pawn: [Odaberi]
5 print("Zdravo svijete!");
Kao što je opisano u poglavlju Započnimo, ovaj red koda zove funkciju zvanu „print“(definirana je u „a_samp.inc“ datoteci, što je razlog zašto vam je potrebna.) i kaže joj da nešto prikaže u konzoli servera(riječ Zdravo svijete!).

Funkcija se sastoji od naziva funkcije(npr. print), koja govori sustavu koji komad koda želite pozvati i listu parametara, zatvoreni u zagradama“()“ nakon naziva funkcije, koje prenosi dodatne podatke u funkciju kako bi ga pokrenuli. Da niste imali parametre trebali biste milijune funkcija:

Pawn: [Odaberi]
1 printa();
2 printaa();
3 printab();
4 printac();
5 I tako dalje...

Funkcije mogu imati koliko god parametara želite, od 0 na dalje(vjerojatno postoji granica, ali može barem 128):

Pawn: [Odaberi]
1 printf("Zdravo svijete!", 1, 2, 3, 4, 5, 6);
Ne brinite o tome što koja funkcija radi za sada, samo da ima 7 parametara, svakog odvojenog zarezom.

Defining(Definiranje)

Osim što je moguće pozvati postojeće funkcije također možete napisati i pozvati svoje vlastite funkcije:

Pawn: [Odaberi]
1 #include <a_samp>2
3 main()
4 {
5 return MyFunction();
6 }
7
8 MyFunction()
9 {
10 print("Zdravo svijete!");
11 return 1;
12 }

To radi točno isto kao izvorni kod, ali je uređen drugačije. Kada je „main[]“ pozvan, kada je mod pokrenut(pozvan je automatski) poziva novu prilagođenu funkciju pod nazivom „MyFunction()“. Ova funkcija ispisuje poruku u konzoli servera zatim vraća broj 1 u „main()“. „Main()“ uzima vraćenu vrijednost(1) i zatim ju vraća samom serveru(tj. na mjesto koje se prvenstveno zove „main“ ).

Pošto je "return MyFunction();" jedna izjava ili tvrdnja, također možete napisati ovako:

Pawn: [Odaberi]
1 #include <a_samp>2
3 main() return MyFunction();
4
5 MyFunction()
6 {
7 print("Zdravo svijete!");
8 return 1;
9 }

No većina ljudi ne radi to zbog jasnoće tijekom čitanja koda. Također možete da uopće ne koristite funkciju „MyFunction return value“ i napišete ovako:

Pawn: [Odaberi]
1 #include <a_samp>2
3 main()
4 {
5 MyFunction();
6 return 1;
7 }
8
9 MyFunction()
10 {
11 print("Zdravo svijete!");
12 return 1;
13 }


Parameters(Parametri)

Parametri su tipovi varijable koje ne trebate objaviti jer oni dolaze iz mjesta koje je pozvalo funkciju:

Pawn: [Odaberi]
1 #include <a_samp>2
3 main()
4 {
5 return MyFunction("Zdravo svijete!");
6 }
7
8 MyFunction(string[])
9 {
10 print(string);
11 return 1;
12 }

Ovaj broj još uvijek radi istu stvar,ali mi sada govorimo „MyFunction()“ što da prikaže. Poziv prenosi „string“(niz znakova) „Zdravo svijete!“ u funkciju gdje je spremljen u varijablu zvanu „string“(„[]“ znači da je niz kao što je objašnjeno prije). „Print“ funkcija je pozvana prenoseći sadržaj „string“ varijable, znamo da je to varijabla jer više nema navodnike(““).

Variables(Varijable)

Varijabla je u osnovi djelić memorije, to je mjesto gdje se podaci pohranjuju i mogu se mijenjati i čitati po potrebi. Varijable su jedna ili više ćelija, ćelija je 32 bita (4 bajta) velika i prema zadanim postavkama potpisan, tako da se mogu pohraniti na -2147483648 do 2147483647(iako je -2147483648 slabo definiran u pawnu i daje čudne rezultate, ako se prikazuje). Varijabla izrađena od više od jedne ćelije se zove niz, stringovi su posebna vrsta niza u kojima svaka ćelija ima znak iz niza podataka(stringa). (ili 4 znaka u zapakiranom nizu podataka, ali nisu pokriveni ovdje).

Declaration(Deklaracija)

Da biste stvorili novu varijablu, morate ju objaviti tj. deklarirati: 

Pawn: [Odaberi]
1 new
2 myVariable;

Setting(Postavljanje)

Pawn: [Odaberi]
1 new
2 myVariable = 7;

Ovaj dio koda deklarira novu varijablu i postavlja joj početnu vrijednost do 7, tako da će sada ispisivanje varijable dati 7. Da biste prikazali varijablu koja nije string moramo se vratiti na printf () funkciju spomenutu ranije i učiniti ovo:

Pawn: [Odaberi]
1 new
2 myVariable = 7;
3 printf("%d", myVariable);

Opet, za sada sve što trebate znati jest da će ovaj dio koda ispisati vrijednost „myVariable“ (tj. 7 u ovom trenutku) na serveru.

Pawn: [Odaberi]
1 new
2 myVariable = 7;
3 printf("%d", myVariable);
4 myVariable = 8;
5 printf("%d", myVariable);

Taj dio koda će sprintati tj. prikazati broj 7, promijenite vrijednost varijable na 8 i prikazati će nove vrijednosti u prozoru servera također. Postoje mnoge druge stvari koje možete učiniti varijablama, neke su navedene u nastavku, najčešće su navedene negdje drugdje:

Pawn: [Odaberi]
1 myVariable = myVariable + 4;
Postavlja vrijednost „myVariable“ varijable na staru vrijednost „myVariable“ varijable plus 4, odnosno povećava njenu vrijednost za 4. To se također može zapisati kao:

Pawn: [Odaberi]
1 myVariable += 4;
Što samo znači "povećavaj vrijednost „myVariable“ varijable za 4".

Pawn: [Odaberi]
1 myVariable -= 4;
To će smanjiti vrijednost varijable za 4.

Pawn: [Odaberi]
1 myVariable *= 4;
To će pomnožiti vrijednost varijable sa 4.

Pawn: [Odaberi]
1 myVariable /= 4;
To će podijeliti vrijednost sa 4.

Arrays(Nizovi podataka)

Declaration(Deklaracija)

Array je varijabla u koju možete pohraniti više komada podataka odjednom i pristupiti im dinamično.

Array je deklariran da postavi veličinu za vrijeme sastavljanja koda, tako da trebate unaprijed znati koliko ćete komada podataka pohraniti. Dobar primjer za to je vrlo često korišten „MAX_PLAYERS“ niz (array), to će imati jedan slot za svakog vjerojatno povezanog igrača, tako da znate da se podaci za jednog igrača neće miješati s podacima za drugog igrača (više na definiranju kasnije).

Pawn: [Odaberi]
1 new
2 myArray[5];

Taj kod će deklarirati niz podataka(array) velik 5 slotova(mjesta). tako da možete pohraniti 5 komada normalnih podataka odjednom u taj jedan, što ne možete napraviti je sljedeće: 

Pawn: [Odaberi]
1 new
2 myVariable = 5,
3 myArray[myVariable];

Taj kod izgleda kao da će stvoriti niz veličine bez obzira na broj pohranjen u „myVariable“ varijabli(ovdje 5, ali moglo bi biti bilo što), no ne možete učiniti ovo. U Pawnu memorija za varijable je dodijeljena kada sastavite svoj kod, to znači da su nizovi(arrays) uvijek jedne veličine, ne možete postaviti veličinu na što god želite i kada to želite.

Accessing(Pristupanje)

Za postavljanje vrijednosti u niz trebate reći u koji dio niza želite pohraniti podatke, to se može učiniti s još jednom varijablom:

Pawn: [Odaberi]
1 new
2 myArray[5];
3 myArray[2] = 7;

Taj dio koda će deklarirati niz sa 5 slotova i dati trećem slotu vrijednost 7, s obzirom da varijable uvijek počinju kao 0 to će napraviti vrijednosti u polju:

Pawn: [Odaberi]
1 0, 0, 7, 0, 0
Zašto ne:

Pawn: [Odaberi]
1 0, 7, 0, 0, 0
sad se pitate? To je zato što brojanje zapravo počinje od broja 0, nije 1. Razmotrite sljedeće:

Pawn: [Odaberi]
1 2, 4, 6, 8
Ako idete kroz popis onda nakon broja 2 ste već imali jedan broj (2), to znači da, ako brojite brojeve s vremenom dođete do broja 4 na kojem se već nalazite, niste na 1 kada dođete do 2, nego ste na nuli. Na taj način 2 je na poziciji nule, a 4 je na položaju jedan, i na taj način slijedi da je 6 na poziciji dva, što je, gdje se nalazi 7 u prvom primjeru. Ako ćemo označiti slotove(mjesta) za prvi primjer dobit ćemo ovo:

Pawn: [Odaberi]
1 0 1 2 3 4
2 0 0 7 0 0

Postoji pet slotova(mjesta), ali kao što možete vidjeti, i to je vrlo važno, nema slota(mjesta) broj 5, na sljedeći način možete srušiti vaš server:

Pawn: [Odaberi]
1 new
2 myArray[5];
3 myArray[5] = 7;

Kao što je spomenuto iznad niza indeksa, (indeks je slot(mjesto) na koji pišeš), može biti bilo što, broj, varijabla, ili čak i funkcija koja vraća vrijednost.

Pawn: [Odaberi]
1 new
2 myArray[5],
3 myIndex = 2;
4 myArray[myIndex] = 7;

Jednom dok imate niz(array) i indeks možete koristiti taj blok točno kao da je bilo koja druga varijabla:

Pawn: [Odaberi]
1 myArray[2] = myArray[2] + 1;
2 myArray[2] += 1;
3 myArray[2]++;

Primjer

Kao što je već spomenuto iznad, zajednički tip niza(array) je niz MAX_PLAYERS. MAX_PLAYERS nije varijabla, to je „define“ što ću vam objasniti kasnije, ali za sada prihvatite da je to konstantan broj jednak maksimalnom broju igrača koje server može sadržavati(to je standardno 500, pa čak i ako promijenite broj u „server.cfg“ datoteci). Sljedeći kod koristi normalne varijable za držanje podataka za 4 igrača i učini nešto s tim igračima u funkciji(Radi jednostavnosti pretpostavljamo da je MAX_PLAYERS za sada 4):

Pawn: [Odaberi]
1 new
2 gPlayer0,
3 gPlayer1,
4 gPlayer2,
5 gPlayer3;
6
7 SetPlayerValue(playerid, value)
8 {
9 switch(playerid)
10 {
11
12     case 0: gPlayer0 = value; if(playerid == 0)
13
14     case 1: gPlayer1 = value; if(playerid == 1)
15
16     case 2: gPlayer2 = value; if(playerid == 2)
17
18     case 3: gPlayer3 = value; if(playerid == 3)
19 }
20 }

Pogledajte odjeljak o kontrolnim strukturama(na samp wiki) za više informacija o tome što se tamo događa, Također, imajte na umu to se može učiniti kao prekidač(switch), ali to je manje jasno za primjer i učinkovito isti kod svakom slučaju. Sada usporedite to koristeći niz s jednim slotom(mjestom) po igraču, imajući na umu da Indeks polje ili niz(array) može biti bilo koja vrijednost:

Pawn: [Odaberi]
1 new
2 gPlayers[MAX_PLAYERS];
3
4 SetPlayerValue(playerid, value)
5 {
6 gPlayers[playerid] = value;
7 }

To će stvoriti globalni niz (vidi odjeljak o opsegu dolje) s jednim slot za svakog igrača, onda će funkcija dodijeliti sve što je u varijabli „value“, tj. "vrijednost" u slot za navedenog igrača. Prvi primjer je bio dosta velik samo za 4 igrača, korištenjem četiri linije po igraču, odnosno 2000 linija za 500 igrača (ako može biti manje, ali to je još uvijek puno), druga verzija je jedan redak bez obzira koliko igrači imate.

Strings(Tip podataka)

Osnovna uporaba

String je posebna vrsta niza podataka(Array, polju), onaj koji se koristi za držanje više znakova kako bi stvorili riječ ili rečenicu ili drugi ljudima razumljiv tekst. Znak je jedan bajt velik(iako postoje prošireni setovi gdje je znak više bajtova velik, ali ti nisu dobro definirani u SA:MP-u) i po zadanom znak zauzima jednu ćeliju(jedna normalna varijabla ili jedan array slot tj. mjesto). Znakovi su kodirani u sustavu zvanom ASCII, znak “A“ je predstavljen brojem 65, govoreći sustavu da prikaže broj će dati 65, opet govoreći sustavu da prikaže znak će dati veliko slovo “A“. Očito je da će jedan znak zauzeti jednu ćeliju, a više znakova(npr. tekst)zauzeti će više ćelija, kolekcije ćelija, baš kao što je objašnjeno, se nazivaju nizovi ili polja(Arrays).
Ako želite znati više o ASCII-u možete pogledati sve što piše o njemu na samp wiki stranici.

Stringovi u PAWN-u(i u drugim jezicima) su ono što se zove "NULL terminated", to znači da kada dođe do 0, string završava. To nije isto kao znak "0", predstavljen brojem 48, ovo je NULL znak, predstavljen brojem 0. To znači da možete imati string niz veličine 20 ćelija, ali imaju samo string dug 3 znaka, ako je četvrti znak NULL, signalizirajući kraj niza. No, međutim, ne možete imati string dug 20 znakova jer NULL znak mora biti u nizu(array), tako da u 20 ćelija niza možete imati 19 string znakova i "NULL termination" znak. 

Pawn: [Odaberi]
1 new
2 myString[16] = "Zdravo svijete!";

Taj kod deklarira novi string s dovoljno prostora za 15 string znakova i postavlja ga inicijalno na pet string znakova "Zdravo svijete!", dvostruki navodnici oko teksta ukazuju na to da je string. Iznutra niz ili polje će izgledati ovako: 

Pawn: [Odaberi]
1 104 101 108 108 111 0 x x x x x x x x x x
“X“ znači bilo što, u ovom primjeru svi oni će biti 0, ali kako su nakon NULL znaka nije važno što su oni, oni neće utjecati na string. 

Stringovima se može manipulirati kao normalnim nizovima, primjerice:

Pawn: [Odaberi]
1 new
2 myString[16] = "Zdravo svijete!";
3 myString[1] = 97;

Taj kod će promijeniti znak u slotu, tj. mjestu 1 u znak predstavljen brojem 97 (malo slovo "a"), rezultira čitajući u stringu "Zdravo". To može biti napisano mnogo čitljivije i lako se urediti kao: 

Pawn: [Odaberi]
1 new
2 myString[16] = "Zdravo svijete!";
3 myString[1] = &#039;a';

Jednostruki navodnici oko “a“ znače da je “a“ znak, a ne string, znakovi ne moraju biti NULL terminated pošto su uvijek samo jednu ćeliju dugi, oni se također mogu koristiti naizmjenično s brojevima, ako znate što oni predstavljaju. 

Pawn: [Odaberi]
1 new
2 myString[16] = "Zdravo svijete!";
3 myString[1] = &#039;\0';

'\0' su dva znakova, međutim \ je posebni znak koji mijenja sljedeći znak, \0 znači NULL, taj kod je isti kao i sljedeći:

Pawn: [Odaberi]
1 new
2 myString[16] = "Zdravo svijete!";
3 myString[1] = 0;

Ali NIJE isto kao sljedeće:

Pawn: [Odaberi]
1 new
2 myString[16] = "Zdravo svijete!";
3 myString[1] = &#039;0';

Prva i druga verzija će rezultirati u string jednostavno sa:

Pawn: [Odaberi]
1 h
Treća verzija će rezultirati u string sa:

Pawn: [Odaberi]
1 h0llo
Escape character(obrnuta kosa crta)

Kao što je ukratko spomenuto backslash ili obrnuta kosa crta je posebni znak,a radi ovako:

Pawn: [Odaberi]
1 '\'
ili ovako:

Pawn: [Odaberi]
1 "\"
Za ovaj način iznad, PAWNO će izbaciti error jer obrnuta kosa crta izmjenjuje sljedeći znak, pa se te konstante neće ispravno završiti, to se može koristiti za stvaranje znakova koji se obično ne mogu stvoriti, na primjer:

Pawn: [Odaberi]
1 new
2 myString[4] = "\"";

Taj kod će stvoriti string koji se sastoji od samo dvostrukih navodnika, inače dvostruki navodnici signaliziraju kraj pisanog stringa,ali backslash čini dvostruke navodnike odmah nakon toga dijela stringa, i dvostruki navodnici nakon toga završavaju string. Ostali posebni znakovi su:



Tu su i drugi, ali ovi su najvažniji.

Tags(Oznake)

Oznaka(Tag) je dodatni dio podataka na varijable koje se definiraju gdje se mogu koristiti. Na primjer:

Pawn: [Odaberi]
1 new
2     Float:a = 6.0;

"Float" je dio oznake, ovo definira ovu varijablu kao float (ne-cijeli broj) i određuje gdje se mogu koristiti.

Pawn: [Odaberi]
1 native SetGravity(Float:gravity);
To znači da SetGravity funkcija preuzima jedan parametar koji mora float, na primjer:

Pawn: [Odaberi]
1 SetGravity(6.0);
2 new
3    Float:fGrav = 5.0;
4 SetGravity(fGrav);

Taj kod će staviti gravitaciju na 6 (6,0 kao float) pa zatim na 5 (5.0 kao float).

Korištenje pogrešne oznake na krivom mjestu često će dati neusklađenost oznake(tag mismatch):

Pawn: [Odaberi]
1 SetGravity(MyTag:7);
To će pokušati postaviti težinu na 7 s oznakom "MyTag", to očito nije "Float", tako je pogrešno. Također, imajte na umu da su oznake osjetljive na veličinu slova.

Scope(Djelokrug)

Scope(Djelokrug) je mjesto gdje se varijabla može koristiti. Postoje četiri glavna djelokruga: lokalni, lokalni statički, globalni i globalni statički. Sve varijable mogu se koristiti samo nakon što su deklarirane kako treba, a to je ovako:

Pawn: [Odaberi]
1 new
2     var = 4;
3 printf("%d", var);

A NE ovako:

Pawn: [Odaberi]
1 printf("%d", var);
2 new
3     var = 4;

Lokalni Scope

Lokalna varijabla je ona koja deklarira "new" unutar funkcije ili dijela funkcije:

Pawn: [Odaberi]
1 MyFunc()
2 {
3     new
4         var1 = 4;
5     printf("%d", var1);
6     {
7         // var1 još uvijek postoji jer je ovo niži nivo8         new
9             var2 = 8;
10         printf("%d %d", var1, var2);
11     }
12     // var2 više ne postoji na višem nivou13 }
14 // var1 više ne postoji

Lokalne varijable se iz vremena na vrijeme resetiraju, na primjer:

Pawn: [Odaberi]
1 for (new i = 0; i < 3; i++)
2 {
3     new
4         j = 1;
5     printf("%d", j);
6     j++;
7 }

Ovaj kod iznad će ispisati tj. prikazati ovo:

Kod: [Odaberi]
1
1
1

Jer je stvoren “J“, ispisan, a zatim uvećan i uništen, pa tada kod radi petlju.

Lokalni statički Scope

Lokalno statički Scope se može koristiti na istom mjestu kao lokalni Scope, ali ne zaboravi svoju staru vrijednost, na primjer:

Pawn: [Odaberi]
1 MyFunc()
2 {
3     static
4         var1 = 4;
5     printf("%d", var1);
6     {
7         // var1 još uvijek postoji jer je ovo niži nivo8         static
9             var2 = 8;
10         printf("%d %d", var1, var2);
11     }
12     // var2 više ne postoji na višem nivou13 }
14 // var1 više ne postoji

Taj kod će se ponašati upravo isto kao i novi primjer, no ovaj:

Pawn: [Odaberi]
1 for (new i = 0; i < 3; i++)
2 {
3     static
4         j = 1;
5     printf("%d", j);
6     j++;
7 }

Će ispisati, tj. prikazati:

Kod: [Odaberi]
1
2
3

Zato što je „J“ statički pa može zapamtiti svoju staru vrijednost.

Globalni Scope

Globalne varijable su deklarirane izvan funkcije i mogu se koristiti u bilo kojoj funkciji:

Pawn: [Odaberi]
1 new
2     gMyVar = 4;
3
4 MyFunc()
5 {
6     printf("%d", gMyVar);
7 }

Nikada se ne resetiraju ili izgube.

Globalni Statički Scope

Globalne statičke varijable su kao normalne Globalne, ali mogu se koristiti samo u datoteci u kojoj su objavljene:

Datoteka1:

Pawn: [Odaberi]
1 static
2     gsMyVar = 4;
3
4 MyFunc()
5 {
6     printf("%d", gsMyVar);
7 }
8
9 #include "File2"

Datoteka2:

Pawn: [Odaberi]
1 MyFunc2()
2 {
3     // Ovo je pogrešno jer gsMyVar ne postoji ovdje4     printf("%d", gsMyVar);
5 }

Statični Scope se također može primijeniti na funkcije na isti način.

KRAJ TUTORIJALA, HVALA VAM NA POZORNOSTI

Primjedbe

  1. Moze neko napraviti kako napraviti komandu za teleportaciju?

    OdgovoriIzbriši

Objavi komentar

Molimo bez vrijeđanja, nacionalizma ili slično,također, taj će biti sankcionisan!