Popular Post Tanga 131 Odesláno: 2. Květen, 2017 Popular Post Share Odesláno: 2. Květen, 2017 Obsah Úvod Čo sú to runtime erorry Príklad použitia Záver ÚvodPri vývoji softvéru je veľmi ľahké urobiť nejakú chybu. Na testovanie (debugovanie) sa používajú rôzne metódy, jednou z tých agresívnejších môžu byť runtime errory.Je len na Vás, či si vyberiete túto metódu s využitím runtime errorov / výnimiek / exceptions.V návode sa v podstate nenaučíte nič nové, patrí medzi "zložitejšie" len preto, že na správne využitie týchto informácií musíte mať isté programátorské myslenie a poznať peklo debugovania komplexných programov. Čo sú to runtime errory Určite ste sa stretli s tým, že Vám padol za behu server s textom Run time error 4: "Array index out of bounds" Stalo sa to, že server na pozadí pri každom priradení hodnoty kontroluje, či ste neprekročili veľkosť premennej. Server zistil, že áno a zhodil server.V momente ste vedeli, že v kóde je chyba.Keby server nepadol, čo by sa stalo?V prípade, že by nedochádzalo ku kontrole, že či nebola prekročená veľkosť pola, zapisovanie údajov by pokračovalo ďalej v pamäti (aj za danou premennou) a mohlo by sa stať, že by sa prepísali hodnoty nasledujúcich premenných / polí.Takáto chyba je prakticky nemožná na detekciu. Napíšem príklad z mojej praxe. Rovnako aj operačný systém vykonáva tieto kontroly, aby ste nemohli prepisovať dáta iných programov.Programovanie systémov bez podobnej kontroly je hotové peklo. Príkladom takého prostredia je napr. mikroprocesor atmega 8.Čo spraví tento cyklus určený pre atmega8, ktorý má len vymazať pamäť? for (int i = 0; i < MEMORY_SIZE; i++) { memory[i] = 0; } Vytvorí nekonečný cyklus.Prečo?Pretože premenná i sa tiež nachádza v pamäti a teda keď dôjde cyklus na jej adresu, nastaví samotné i na 0 a cyklus v podstate ide od znova.Verte mi, nič horšie som nikdy nevidel a nájsť to ma stálo kopu nervov. Čo to obnáša?V prípade, že dôjde k nejakej chybe, padne server.V prípade, že tam nejaká chyba je, nájdete ju ľahšie. Prakticky platí, čim väčší mód, tým ťažšie sa hľadajú chyby a presne to uľahčujú runtime errory.V skratke teda ide len o to, že namiesto bežnej kontroly extrémnych hodnôt premenných, nevrátite "0", "-1", alebo nejakú podobnú hodnotu, ale rovno zhodíte server a poviete programátorovi, kde hľadať chybu.Samozrejme pri nasadení servera online môžete tieto runtime errory vypnúť a používať ich len pri debuggingu.Príklad použitiaPre zjednodušenie práce som dal dokopy definície runtime errorov (žiadny zložitý kód). Includ sa dá stiahnuť tu. Nezabudnite ho uložiť do pawno/include. #define DEBUGGING // povoli run time errory | pre ich vypnutie staci zakomentovat / zmazat tento riadok #include <runtime_errors> // includnut AZ ZA DEFINE DEBUGGING main() { new a = 4; TestZero(a, AMX_ERR_PARAMS, "Tento string sa nevypise kedze a nie je 0."); a = 0; TestZero(a, AMX_ERR_PARAMS, "Hodnota \"a\" nemoze mat nulu."); print("Tento string sa uz nevypise, kedze server padol v predoslom kroku."); } Výstup: ... Loaded 0 filterscripts. Hodnota "a" nemoze mat nulu. Script[gamemodes/test.amx]: Run time error 25: "Parameter error" Number of vehicle models: 0 Odkiaľ je funkcia TestZero()?To je len príklad, nemusíte ju použiť. Nachádza sa už defaultne v include. Vyzerá takto: stock TestZero(var, err, str[]) { // nazov funkcie si zmente ako chcete #pragma unused var, err, str #if defined DEBUGGING if (var == 0) { // tuto podmienku mozete zmenit, vsetko ostatne nechajte tak print(str); switchError(err); } #endif } Svoje vlastné funkcie si môžete vytvoriť na základe predlohy TestZero(), alebo akokoľvek sa rozhodnete. Odkiaľ mám hodnotu AMX_ERR_PARAMS? To sú oficiálne hodnoty vstavané do Pawn AMX, ich zoznam sa nachádza v include runtime_errors, ale na ukážku sem nejaké dám.Ich hodnoty nie sú nijak podstatné, upravujú len správu čo sa vypíše pri páde servera.Môžete tiež všade použiť AMX_ERR_NONE, čo nevypíše žiadnu ďalšiu správu o páde a vypísať svoje vlastné informácie pre uľahčené nájdenie chyby. #define AMX_ERR_NONE 0 #define AMX_ERR_EXIT 1 // forced exit #define AMX_ERR_ASSERT 2 // assertion failed #define AMX_ERR_STACKERR 3 // stack/heap collision #define AMX_ERR_BOUNDS 4 // index out of bounds Úplný zoznam errorov sa nachádza v include. Záver To, či je toto využitie dobré, alebo nie, nikto nemôže povedať.Je to jednoducho štýl programovania a "exceptions", alebo "runtime errory" sú bežnou súčasťou vyšších programovacích jazykov. Ich implementácia v Pawn je vcelku chabá, ale dá sa použiť.Ak sa však raz pre neho rozhodnete, buďte zodpovední a používajte ho všade. 6 Link to comment Share on other sites More sharing options...
DeNisKo 8 Odesláno: 2. Květen, 2017 Share Odesláno: 2. Květen, 2017 Pekný tutoriál 1 Link to comment Share on other sites More sharing options...
Rawy 18 Odesláno: 2. Květen, 2017 Share Odesláno: 2. Květen, 2017 Super, toto se mi bude časem hodit. (y) Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now