A PAWN programozási nyelv

Típusok

Deklaráció

A nyelvben nincsenek konkrét típusok. Minden érték egy adattípusban tárolódik el, melynek neve cella. Változót a new kulcsszóval hozhatunk létre, melyet további láthatósági annotációval láthatunk el. Változó létrehozásakor, ha nem kap értéket (nincs ott az = [valami]), a nulla értékkel inicializálódik

Deklarációs kulcsszavak

Példák

new GlobalisValtozo = 1; // Az alapvető new kulcszó static Statikus1 = 101; // Globális és lokális helyen is stock NemHasznalatosValtozo = 201; // Csak globalis helyen public PublikusValtozo = 301 // Csak globális helyen const Konstans1 = 401 // Globális és lokális helyen is main() { new LokalisValtozo = 2; // Az alapvető new kulcszó static Statikus2 = 102; // Globális és lokális helyen is const Konstans1 = 401 // Globális és lokális helyen is }

Megjegyzés a public deklarációkhoz:

Alap esetben a host program nem látja a scriptbe foglalt new-val létrehozott változókat. A public kulcsszóval a host alkalmazás írni/olvasni tudja. Ezeket speciális célokra szokás használni, mint például hibaszám tárolásához, stb. Ezek csak globális változók lehetnek.

Tömbök

A tömbök a diszkrét indexeken (0, 1, ...) kívül használhat szimbolikus indexeket is, melyekkel struktúrákat is reprezentálhatunk. Az utóbbi azért hasznos, mert a nyelv struktúrákat nem kezel, de a többdimenziós tömbök kezelését támogatja.

Tömbökkel kapcsolatos reprezentatív példák

/* Egy dimenziós tömbbök */ new d[] = [1,4,9,16,25] // Egy D nevű tömb, mely a feltöltődik 5 elemmel new s1[20] = [’a’,’b’] // Tömb, melynek első két eleme 'a' és 'b', a többi 0 new s2[] = ''Hello world!'' // String, azaz karakterek egy tömbje /* Progresszív lérehozás */ new a[10] = { 1, ... } // minden elem 1 lesz new b[10] = { 1, 2, ... } // b = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 new c[8] = { 1, 2, 40, 50, ... } // c = 1, 2, 40, 50, 60, 70, 80, 90 new d[10] = { 10, 9, ... } // d = 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 /* Hibásak */ new e[3] = 2 // Tömb így nem tud értéket felvenni new f = "Good-bye" // Csak tömb tárolhat stringet! new g[] // Ismeretlen méretű tömb new h[2] = { i + j, k - 3 } // A tömb értékeinek constansak kell lennie

Több dimenziós tömbökkel kapcsolatos reprezentatív példák

/* Több dimenziós tömbök létrehozása */ new a[4][3] new b[3][2] = [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ] new c[3][3] = [ [ 1 ], [ 2, ...], [ 3, 4, ... ] ] new d[2]{10} = [ "agreement", "dispute" ] new e[2][] = [ ''OK'', ''Cancel'' ] new f[][] = [ ''OK'', ''Cancel'' ]

Struktúra megvalósítása

Példakód a létrehozáshoz

new msg[.text{40}, .priority] = { "new message", 1 }

Ekkor az msg tömbnek két indexe van, egy text néven elérhető karaktersorozat (40 karakter hosszú lehet), illetve egy priority néven futó változó. Ekkor az alábbi módon férhetünk hozzá a kívánt adatokhoz.

// Egyik út msg[.text] = "another message" msg[.priority] = 10 - msg[.priority] // Másik út (egyszerűsítés) // Ezen látszik a struktúra jelleg msg.text = "another message" msg.priority = 10 - msg.priority

Stringek

A karakterláncok tárolása tömb segítségével történik. Kétféle tárolási módot különböztetünk meg; packed és unpacked. Lényeges különbség a méretben van. A packed string annyi cellát foglal ahány betűből áll, míg az unpacket annyi karakter rak egy cellába amennyi belefér. Egy cellába általában 4 karakter fér, de ez implementációfüggő.

Létrehozás:

new msg[] = ''Hello world!'' // packed new msg{} = "Hello world!" // unpacked

Különbség az index-zárójelben van. Ebből adódóan az egyes típusú string objektum adaott karakterének hozáférésekor a deklarációban megadott típusú zárójelet kell haszálni. Nem megfelelő zárójel és stringhatárolókarakter páros esetén warning üzenetet ad, de megfelelő hivatkozássa úgy működhet, ahogy elvárjuk tőle.

Adott karakterre (indexre) hivatkozás. A kétféle indexelés és kétféle karakterlánc reprezentáció miatt többféle működés is elérhető. Alábbi példakód az össze variációra megadja az eredményt.

new a1[] = ''Hello world!'' ; new a2[] = "Hello world!" ; new a3{} = ''Hello world!'' ; new a4{} = "Hello world!" ; printf("%c\n", a1{1}); // Semmi printf("%s\n", a1{1}); // Semmi printf("%c\n", a1[1]); // e printf("%s\n", a1[1]); // ello world! printf("\n"); printf("%c\n", a2{1}); // e printf("%s\n", a2{1}); // e printf("%c\n", a2[1]); // o printf("%s\n", a2[1]); // o world! printf("\n"); printf("%c\n", a3{1}); // Semmi printf("%s\n", a3{1}); // Semmi printf("%c\n", a3[1]); // e printf("%s\n", a3[1]); // ello world! printf("\n"); printf("%c\n", a4{1}); // e printf("%s\n", a4{1}); // e printf("%c\n", a4[1]); // o printf("%s\n", a4[1]); // o world!

Felváltva vettük az adott karakter (%c) és karakterlác (%s) kiírását. Az utóbbi esetben a megadott indextől írja ki az eredményt, míg nem csomagolt inicializáció után csomagoldként hivatkozunk, az eredmény üres.

Tag-ek

A tag-ek segítségével a változók osztályozhatóak, így "típusok" is bevonhatók a nyelvbe. Megadásuk nem kötelező, de segítségükkel fordítás időben szűrhetőek a hibák.

// szintaxis: : sajattipus:azonosito = 0;

Egy tag lehet erős vagy gyenge, a különbség mindössze annyi, hogy a gyenge tag-ek néhány esetben implicit használhatóak. Ha egy bináris operátor operandusai különböző tagekkel rendelkeznek, vagy csak az egyik van tagelve, akkor “tag mismatch” warningot dob, de a kód fordul.

Tagekkel megvalósított típusok

Idáig csak egy adattípusról beszéltünk: cell, amiben csak szám tárolódik. A PAWN toolkitek tartalmaznak egy modult, amivel kezelhetünk lebegőpontos és fixpontos számokat is. Ezek eléréséhez Tag-elni kell a változókat.

Rational:azonosito = 2.3;

Hasonlóképpen bevonható a logikai típus (true, false).

/* Csak true vagy false értéket vehet fel */ new bool:flag = true;