Page 1 of 1

Kompiliavimo/log klaidos ir kaip jas ištaisyti.

Posted: 2011 Jun 19 15:55
by aaarnas
Čia tikrai ne visos kompiliavimo/log klaidos. Jei kokią nors reikia aprašyti, tai nukopijuokite ją šioje temoje :)

Klaidos:
(log klaidos):
[CSTRIKE] Non-player entity -1 out of range
[CSTRIKE] Invalid player 12
[FUN] Player out of range (0)
[AMXX] Run time error 4: index out of bounds

(kompiliavimo klaidos):
Warning: Loose indentation on line

Paaiškinimai:

Invalid player/ Player out of range...
Ši klaida atsiranda dėl į funkciją perduodamo neteisingo žaidėjo id. Tai yra jei žaidėjo id yra didesnis arba mažesnis už (1:32) aibę arba tas žaidėjas yra atsijungęs arba tam tikrais atvejais miręs.

Kad ištaisyti šią klaidą, prieš reikiamą funkciją turime patikrinti ar žaidėjas yra gyvas, prisijungęs arba ar tai iš viso žaidėjas.

is_user_connected(id) - Gražina tiesą, jei žaidėjas šiuo metu prisijungęs į serverį, be to patikrina ar tai iš viso yra žaidėjas, tad į šią funkciją galima perduoti bet kokią id reikšmę ir ši bus patikrinta.

is_user_alive(id) - Gražina tiesą, jei žaidėjas šiuo metu prisijungęs į serverį bei yra gyvas(laksto po žemėlapį), be to patikrina ar tai iš viso yra žaidėjas, tad į šią funkciją galima perduoti bet kokią id reikšmę ir ši bus patikrinta. Pastaba: ši funkcija taip pat patikrina tą patį, ką ir is_user_connected, tad jei naudojame is_user_alive, papildomai tikrinti su is_user_connected nereikia.

index out of bounds
Ši klaida dažniausiai atsiranda kai mėginama patikrinti masyvo elementą, kurio nėra. Pvz:

Code: Select all

new turi_batus[33] // Šis masyvas turi reikšmes tik nuo 0 iki 32, tad jei parašysime tarkime turi_batus[50] ar turi_batus[-1], tai gausime index out of bounds klaidą.
Norint ištaisyti, reikia tikrinti perduodamą elementą, ar jis neviršija limito. Dažniausia klaida būna kokiame nors death forwarde, kai žudikas būna ne žaidėjas, o koks nors pasaulio elementas. Tikrinti ar tai žaidėjas galima su is_user_connected(id), arba yra optimalesnis būdas:

Code: Select all

#include <amxmodx> #define is_player(%1)   (1 <= %1 <= maxplayers) new maxplayers public plugin_init() {    maxplayers = get_maxplayers()} is_player(id) // Tikrinama ar tai žaidėjo id (t.y. ar id yra 0>id<33). Gražina tiesą, arba netiesą.
Loose indentation

Ši klaida nėra pavojinga ir dažniausiai ją ignoravus viskas gerai veikia, bet vis dėl to ją būtina pataisyti.
Jei nurodytoje eilutėje gauname tokią klaidą, vadinasi kažkas negerai su kodo lygiavimu, pvz:

Code: Select all

public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR)    register_cvar("cvar", "1")} 
Kaip matome, register_plugin eilutė yra neišlygiuota pagal bendrą tvarką, o prisiglaudusi prie kairės. Šiuo atveju reikėtų teisingai išlygiuoti šią eilutę (Su TAB), ir klaida turėtų pradingti:

Code: Select all

public plugin_init() {     register_plugin(PLUGIN, VERSION, AUTHOR)    register_cvar("cvar", "1")} 

Re: Kompiliavimo klaidos ir kaip jas ištaisyti.

Posted: 2011 Jul 03 13:52
by hleV
Čia ne kompiliavimo klaidos, išskyrus gal index out of bounds, bet ją dažniausiai gausi jau serveryje, po sėkmingo kompiliavimo.

Re: Kompiliavimo klaidos ir kaip jas ištaisyti.

Posted: 2011 Jul 03 14:20
by psychical
Man ir kažkas panašaus buvo šovę į galvą, nes kiek žinau tai komplinimo klaidos tai visokie loose intendion ir t.t.

Re: Kompiliavimo/log klaidos ir kaip jas ištaisyti.

Posted: 2011 Jul 03 17:19
by aaarnas
Teisingai. Pataisiau.