Szerző Téma: [Leírás] Debugolás  (Megtekintve 2696 alkalommal)

Nem elérhető Kovacs_Richard

  • 1743
  • HRP Fejlesztő
  • Discord: Kovacs_Richard#0321
    • Profil megtekintése
    • Hun Role Play Web
[Leírás] Debugolás
« Dátum: 2011. December 22. - 05:03:50 »
+8
Egyre több olyannal találkozom mostanában fórumon, hogy a pawno nem ír errort / warning-ot, de \"mégsem mûködik a kód\" és ezért kérnek segítséget...tehát szintaktikailag nincs hiba hisz a kód lefut, max nem úgy ahogy a tervezõ elgondolta :) . Persze erre is van megoldás, meg kell keresni a \"hibát\"...elõször ajánlatos csak simán \"átfutni\" a kódot akár többször is hátha észre veszik a hibát...ha nem eléggé szembetûnõ akkor komolyabb keresést igényel...akkor lehet alkalmazni azt a leírást amit én most leírok...én például így találom meg a hibákat, de létezik más fajta megoldás is...
Elmélet:
3 lépésbõl áll a hiba megtalálása + megoldása:
1. lépés: Kód futásának ellenõrzése
2. lépés: Adatok kiírása
3. lépés: Hiba azonosítása + Kód módosítás
Szituáció:
Localhost-os szerver ( vagy legalábbis a szerver ablakhoz hozzáférek ).
Forráskód:
[pawn]#include <a_samp>
new kocsi = INVALID_VEHICLE_ID;
public OnFilterScriptInit()
{
CreateVehicle(560,1.0,2.0,3.0,4.0,1,1,-1);
return 1;
}
public OnFilterScriptExit()
{
if(kocsi != INVALID_VEHICLE_ID) { DestroyVehicle(kocsi); }
return 1;
}[/pawn]
Mit is szeretnék?
Amikor betöltöm a scriptet akkor lerakjon egy jármûvet a megadott helyre, amikor kitöltöm ( jobb szót nem találtam rá :) ) akkor törölje ki a jármûvet.
Mi a hiba?
Kitöltéskor nem tûnik el a jármû.
DEBUG 1. szakasz: ( Kód futásának ellenõrzése ):
[pawn]#include <a_samp>
new kocsi = INVALID_VEHICLE_ID;
public OnFilterScriptInit()
{
print(\"START\");
CreateVehicle(560,1.0,2.0,3.0,4.0,1,1,-1);
print(\"START2\");
return 1;
}
public OnFilterScriptExit()
{
    print(\"EXIT\");
if(kocsi != INVALID_VEHICLE_ID)
{
    print(\"EXIT2\");
   DestroyVehicle(kocsi);
}
print(\"EXIT3\");
return 1;
}[/pawn]
Eredménye: ( szerver ablakba kiíródnak ezek a szövegek )
START
START2
EXIT
EXIT3
Következtetés:
Látom, hogy az EXIT2 nem íródott ki...de vajon miért?
[pawn]if(kocsi != INVALID_VEHICLE_ID)[/pawn]
ez a feltétel nem érvényesült, vajon mitõl lehet ez? talán a változó amit ellenõrzök nem azt az értéket kapja amit szeretnék?
DEBUG 2. szakasz: ( Adatok kiírása ):
[pawn]#include <a_samp>
new kocsi = INVALID_VEHICLE_ID;
public OnFilterScriptInit()
{
CreateVehicle(560,1.0,2.0,3.0,4.0,1,1,-1);
printf(\"Start: %d\",kocsi);
return 1;
}
public OnFilterScriptExit()
{
printf(\"Exit: %d\",kocsi);
if(kocsi != INVALID_VEHICLE_ID) { DestroyVehicle(kocsi); }
return 1;
}[/pawn]
Eredménye: ( szerver ablakba kiíródnak ezek a szövegek )
Start: 65535
Exit: 65535
Következtetés:
65535 = INVALID_VEHICLE_ID...tehát a \"kocsi\" nevû változó VALAMIÉRT nem kapta meg a várt értékét...
DEBUG 3. szakasz: ( Hiba azonosítása + Kód módosítás )
Rájöttem, hogy valami miatt a \"kocsi\" változó értéke 65535 maradt, vajon mitõl is lehetett ez? Elértem volna a jármû limitet? VAGY szimplán figyelmetlenül kódoltam és valamit nem úgy írtam meg ahogy kellett volna? ( ilyenkor több hiba lehetõséget érdemes számba venni, hisz egy vagy akár több oka is lehet a hibának )
Nézegetem a kódot és látom, hogy a \"kocsi\" változóhoz nem rendeltem hozzá a CreateVehicle függvény visszatérési értékét...hát itt a hiba :)
[pawn]#include <a_samp>
new kocsi = INVALID_VEHICLE_ID;
public OnFilterScriptInit()
{
kocsi = CreateVehicle(560,1.0,2.0,3.0,4.0,1,1,-1);
return 1;
}
public OnFilterScriptExit()
{
if(kocsi != INVALID_VEHICLE_ID) { DestroyVehicle(kocsi); }
return 1;
}[/pawn]
és máris lefut a kód, úgy ahogy szerettem volna :)
Ez egy elég egyszerû szemléltetés volt, bonyolultabb kódoknál is alkalmazható, tapasztalataim szerint :) .
Nem szükséges mindig mind a 3 lépés ! Amikor nem fut úgy a kód, ahogy szeretnénk és ránézésre meglátjuk a hibát akkor a 3. lépést alkalmazzuk...viszont van olyan eset, hogy vagy az 1-es vagy a 2-es lépésre van szükség...
Én 2 gépen dolgozom egyszerre, egyiken programozom a másikon tesztelek, ( szerver a programozós gépen fut ) és ott is alkalmazható a szerver ablakba kiírásos módszer, viszont ha valakinek valami oknál fogva nem megoldható a szerver ablakhoz való hozzáférés akkor nem print és printf alkalmazása ajánlott hanem SendClientMessage vagy SendClientMessageToAll...persze ha szükséges akkor elõtte szöveg formázás format-al ( 2-es szakasz )... ( ha nem férünk hozzá a szerver ablakhoz és mégis print / printf-et alkalmazunk akkor a szerver log fájljában találhatjuk meg a \"végeredményeket\" )
Wiki-s linkek:
http://wiki.sa-mp.com/wiki/Print
http://wiki.sa-mp.com/wiki/Printf
http://wiki.sa-mp.com/wiki/Format
http://wiki.sa-mp.com/wiki/SendClientMessage
http://wiki.sa-mp.com/wiki/SendClientMessageToAll
Régóta nem tevékenykedem, mint SA-MP scripter.
HRP Fejlesztő.

Nem elérhető IXT

  • 2502
  • Steph Curry
    • Profil megtekintése
[Leírás] Debugolás
« Válasz #1 Dátum: 2011. December 22. - 08:27:27 »
0
Köszönjük!

Nem elérhető KDDomi

  • 976
    • Profil megtekintése
[Leírás] Debugolás
« Válasz #2 Dátum: 2011. December 22. - 10:30:11 »
+1
Köszi ez pont kellet! Grat!

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal