Re: [ TuT ] Preprocesor

Sekcia určená pre programovací jazyk pawn.

[ TuT ] Preprocesor

Poslaťod Iron[CZ] » Sob 13. Aug 2011 12:08:47

Preprocesor
Preprocesorování, tak se nazývá první fáze kompilace pawn kódu. Prakticky je to vyčištění kódu, než je kompilován. Jsou odstraněny komentáře. Preprocesor v pawnu je velmi totožný s preprocesorem v C. Hlavní preprocesorovou direktivitou je #define, pomocí které se definují preprocesorová makra.
Kód: Vybrať všetko
#define number 5
#define StartString "Vitejte na serveru"

Které následně můžete použít v kódu.
Kód: Vybrať všetko
SendClientMessage(playerid, COLOR_CERVENA, StartString);

V pawnu můžete
Kód: Vybrať všetko
#define number 5

nahradit ekvivalentem v podobě
Kód: Vybrať všetko
new number = 5;

Tyto ekvivalenty jsou ale pro čísla lepší, mají lepší kontrolu chyb a lze měnit jejich hodnotu. Makro může mít až 10 parametrů. Zde je ukázka v podobě funkce minimum, která porovná dvě čísla a zjistí, které má větší hodnotu.
Kód: Vybrať všetko
#define minimum(%1,%2) ((%1) < (%2) ? (%1) : (%2))

Správné použití funkce minimum:
Kód: Vybrať všetko
new a = 4;
new b = 6;
new min = minimum(a,b);

A takto vypadá špatné použití:
Kód: Vybrať všetko
new a = 4;
new b = 6;
new min = minimum(a++,b);

V této funkci nemůžeme použít inkrement, protože při následném preprocesorování:
Kód: Vybrať všetko
new a = 1, b = 4
new mininum = ((a++) < (b) ? (a++) : (b))

By došlo k dvojnásobné inkrementaci. Dobré je přikládat makru argumenty v závorce, zde je ukázka:
Kód: Vybrať všetko
#define div(%1,%2) (%1 + %2 - 1) / %2

Tato funkce vydělí první argument druhým a vrátí celé číslo, zaokrouhluje nahoru.
Kód: Vybrať všetko
new n = 5;
new b = div(8, n-2);

Provede se následující:
Kód: Vybrať všetko
new b = (8 + n - 2 - 1) / n - 2;

V tomto příkladu je b nastaveno na 0.
Teorie je složitá, ale když proniknete a pochopíte preprocesor a začnete ho využívat, docílíte vysokých výsledků.
Direktivy preprocesoru
Druhá část bude o něco zábavnější, jedná se o jednotlivé direktivy, které můžeme použít pro preprocesor. Všechny musí být na samostatném řádku, začínat znakem #. Jediná direktiva, která může zabírat více řádku než jeden, je #define.
#assert
Použitelné pro kontrolu, jako je počet bytů v buňkách, nebo počet znaků. Pokud je překročena hodnota, je zastavena kompilace.
Kód: Vybrať všetko
#define M 0
#assert M > 0

#define
Definuje makro, může obsahovat parametry značené jako %0, %1. Pomocí definic můžeme definovat kódy barev, nebo i například celý cyklus for.
Kód: Vybrať všetko
#define PLAYERS new i = 0; i < MAX_PLAYERS; i++) if (IsPlayerConnected(i)

Kód: Vybrať všetko
for (PLAYERS)

#endinput
Zavře aktuální soubor a ignoruje veškerý text pod direktivou.
#error
Zastaví kompilaci a vypíše chyby.
#file
Nastaví jméno právě otevřeného souboru. Někdy to může být užitečné, ale pravděpodobně také nevyužijete.
#if
Kontroluje direktivu definovanou pomocí #define.
Kód: Vybrať všetko
#define znak 5
#if znak > 5
#error znak je prilis dlouhy
#endif

#elseif
Stejné jako normální použití elseif, toto je ale u direktiv.
#else
Totéž.
Kód: Vybrať všetko
#define num 5
#if num > 5
print ("num je vetsi nez 5");
#else
print ("num je mensi nez 5");
#endif

#include
Všem známá direktiva. Nahraje soubor .inc s funkcemi do módu. Můžete však nahrát i .pwn soubor.
Kód: Vybrať všetko
#include <incl.inc>

#line
Zbytečná funkce, která určuje číslo řádku. Nevyužijete.
#pragma
Tato část bude trochu delší. Pragma třeba určuje varování při špatném zarovnání a má speciální funkce, kterými jsou:
  • align - Pomocí této funkce můžete měnit například počet bytů v globální nebo statické proměnné, na 8, 16, a 32 bytů. Funkce změní počet bytů v proměnné, která je deklarování pod funkcí.
  • amxlimit - Určuje maximální velikost v bytech, kterou může .amx skript dosáhnout. Tato hodnota udává množství paměti potřebné pro kód a ostatní statická data.
  • amxram - Nastaví maximální velikost paměti na data, která má zkompilovaný skript. Paměť se určuje v bytech.
  • codepage - Dost složitá funkce, kterou raději nepoužívejte. Pracuje s kódování znaků v Unicode/UCS-4.
  • ctrlchar - Také složitá funkce. Označuje znak, který budou použit pro začátek sekvence a konec sekvence. Základní znak je /.
  • deprecated - Opět složitá funkce, která označuje znak. Když ten znak je použit ve skriptu, kompilátor vydá varování.
  • dynamic - Nastaví hodnotu určenou pro dynamické datové typy.
  • library - Zajímavá funkce, která nastaví rozšíření modulem, který obsahuje nativní funkce. Modul platí od místa, kde se nachází funkce až na konec.
  • overlay - Tuto funkci nevyužijete, nebudu ji ani moc popisovat. Zjednodušeně funkce generuje dynamický kód.
  • rational - Zapne podporu racionálních čísel.
  • semicolon - Složitá funkce, která pracuje s povinným a nepovinným psaním středníků a ostatních oddělovačů.
  • tabsize - Určuje počet znaků mezi dvěma po sobě následujícími pozicemi oddělenými tlačítkem TAB. Pokud nastavíte na hodnotu 0, neobjeví se vám warningy loose identitation.
  • unused - Tato funkce může deaktivovat nepoužité parametry příkazu. Velmi ji třeba poznáte z funkce pro příkazy dcmd, kde hlavně používáte #pragma unused params. Deaktivované symboly musí být odděleny čárkou.
#section
Vytvoří novou sekci. Všechny proměnné a konstanty, které jsou deklarovány jsou použitelné pouze pro tu sekci, do které patří. Tím můžete vytvořit více sekcí výsledného souboru.
#tryinclude
Pracuje podobně jako #include, pokud však daný .inc neexistuje, kompilace neselže.
#undef
Tato funkce o opak funkce #define. Odstraňuje zadanou definici direktivy.
#emit
Složitá funkce, v podstatě IN-LINE kompilátor.

Konec.
Obrázok užívateľa
Iron[CZ]
Nováčik
Nováčik
 
Príspevky: 125
Registrovaný: Pon 19. Júl 2010 20:56:53
Bydlisko: Týniště nad Orlicí

Re: [ TuT ] Preprocesor

Poslaťod _Martin_ » Sob 13. Aug 2011 12:10:49

Pekný tutoriál. Toto som potreboval ;). 1o/1o ! Keby sem napíšeš tutoriál na mysql bol by som ti vďačný :)
Naposledy upravil _Martin_ dňa Sob 13. Aug 2011 12:33:15, celkovo upravené 1
Obrázok
Obrázok užívateľa
_Martin_
VIP Member
VIP Member
 
Príspevky: 564
Registrovaný: Sob 13. Aug 2011 10:36:46
Bydlisko: Bagdad, Irak

Re: [ TuT ] Preprocesor

Poslaťod Iron[CZ] » Sob 13. Aug 2011 16:14:31

To nevím, už tenhle preprocesor půlka lidí nevyužije a nepochopí.
Obrázok užívateľa
Iron[CZ]
Nováčik
Nováčik
 
Príspevky: 125
Registrovaný: Pon 19. Júl 2010 20:56:53
Bydlisko: Týniště nad Orlicí

Re: [ TuT ] Preprocesor

Poslaťod BrUn3S » Sob 27. Aug 2011 11:04:43

krása!! :) 10/10
Obrázok
[size=100][size=100][size=100][size=100][size=100][size=100][size=100][size=100][size=100][size=100][size=100][size=100][size=100][b][b][b][b]★★★BrUn3S★★★[/b][/b][/b][/b] [/size][/size][/size][/size][/size][/size][/size][/size][/size][/size][/size][/size][/size]
BrUn3S
Nováčik
Nováčik
 
Príspevky: 38
Registrovaný: Uto 03. Máj 2011 16:50:02


Späť na Pawn

Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 0 hostia

cron