Asseracje w pawn

Do czego służą asseracje można znaleźć na wielu stronach np.

W zasadzie w pawnie służą one do tego samego co wszędzie czyli do debugowania.
Mamy nawet dwa dostępne typy asseracji

  • Pierwszy z nich to dyrektywa preprocesora w postaci
    [pawn]#assert constant expression[/pawn]

    Warunek jest sprawdzany podczas kompilacji
    Przykład
    [pawn]#include

    public plugin_init()
    {
    #assert 1 == 2
    }[/pawn]
    i komunikat
    [pawn] fatal error 110: assertion failed: 1 == 2[/pawn]
    lub
    [pawn]#include

    const constVariable = 2;

    public plugin_init()
    {
    #assert constVariable == 1
    }[/pawn]
    komunikat
    [pawn]fatal error 110: assertion failed: constVariable == 1[/pawn]

  • Drugi typ asseracji to aseracje sprawdzane podczas działania pluginu. Używamy tutaj instrukcji [pawn]assert wyrażenie[/pawn]
    Należy pamiętać że podczas testowania kodu z asseracjami należy załadować plugin w trybie debug inaczej przy warunku w asseracji który zwróci false nasz serwer zaliczy crasha 😉

    Przykład użycia
    [pawn]#include
    #include

    #define PLUGIN „New Plugin”
    #define AUTHOR „DarkGL”
    #define VERSION „1.0”

    public plugin_init()
    {
    register_plugin(PLUGIN, VERSION, AUTHOR)

    new testVariable = 1;

    assert testVariable < 0
    }[/pawn]
    i komunikat w logach
    [pawn][AMXX] Displaying debug trace (plugin „assertTest3.amxx”)
    [AMXX] Run time error 2: assertion failed
    [AMXX] [0] assertTest3.sma::plugin_init (line 14)[/pawn]

    Możemy tu podawać dowolne warunki ale zgodnie z zasadami opisanymi w linkach na początku wpisu.

    Asseracji w kodzie który chcemy opublikować ( a raczej w jego skompilowanej wersji ) pozbywamy się poprzez dołaczenie do parametrów kompilacji opcji -d1 lub -d0 ( http://darkgl.pl/index.php/2013/08/19/optymalizacja-dzialania-pluginow-poprzez-parametry-kompilacji/

Nie ma co ukrywać że modyfikacja parametrów kompilacji nie jest najprzyjemniejszym sposobem szczególnie jeśli udostępniamy nasz kod publicznie 😉

Dlatego napisałem mały plik inc który pozwala na wyłączanie mechanizmu asseracji za pomocą definiowania makra preprocesora

Udostępnia on dwa makra

  • assert – ten sam efekt co drugi sposób asseracji opisany powyżej
  • shouldntReachHere – plugin nie powinien dotrzeć do tego miejsca w kodzie następuje natychmiastowy „wyrzut” błędnej asseracji do logów

Same asseracje wyłączamy dodając taką o to definicję przed include pliku assert.inc
[pawn]#define NDEBUG[/pawn]

Przykład użycia
[pawn]#include
#include

#define PLUGIN „New Plugin”
#define AUTHOR „DarkGL”
#define VERSION „1.0”

#include

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)

new n = 1;

assert( n < 0 )
}[/pawn]

i przykład gdzie asseracje są wyłączone
[pawn]#include
#include

#define PLUGIN „New Plugin”
#define AUTHOR „DarkGL”
#define VERSION „1.0”

#define NDEBUG
#include

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)

new n = 1;

assert( n < 0 )
}
[/pawn]

oraz shouldntReachHere
[pawn]#include
#include

#define PLUGIN „New Plugin”
#define AUTHOR „DarkGL”
#define VERSION „1.0”

#include

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)

shouldntReachHere()
}[/pawn]

assert.inc Download

Jeden komentarz o “Asseracje w pawn

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.