LSL Errors/pl

From Second Life Wiki
Jump to: navigation, search

Komunikaty błędów w czasie uruchamiania

Podzczas wykonywania skrypt może zwrócić błąd "Script run-time error" po którym następuje jeden z następujących komunikatów:

Script run-time error: Heap Error

To oznacza "nie wygaduj nonsensów". Np nie zwracaj listy składającej się z jednego wpisu tworzonego przez procedurę nie zwracającą wyników.

Script run-time error: Lists may not contain lists

Zmienna typu list nie może być elementem innej zmiennej typu list.

Script run-time error: Math Error

Zmienna typu float lub integer dzielona przez zero itp.

Script run-time error: Stack-Heap Collision

Stos wszedł na obszar z kodem skryptu lub stertą (heap).

Każdy skrypt ma do dyspozycji 16 KB pamięci, podzielone między stos (stack), kod (bytecode) i stertę (heap).

Ten błąd może być spowodowany zbyt długim skryptem, którego kompilacja powoduje powstanie zbyt dużego kodu. Taki skrypt może się skompilować i zachować poprawnie, ale gdy zrezujesz obiekt z nim, skrypt się zatrzyma, natychmiast lub po jakimś czasie.

Zobacz llGetFreeMemory.

Przykładowe skryty generujące błędy wykonania

Skompiluj i wykonaj poniższe skrypty żeby zobaczyć komunikaty błędów.

default
{
    state_entry()
    {
        llOwnerSay((string) [llOwnerSay("bye")]); // Script run-time error: Heap Error
    }
}
default
{
    state_entry()
    {
        list once = [];
        list twice = [once, once]; // Script run-time error: Lists may not contain lists
    }
}
default
{
    state_entry()
    {
        float one = 1.0;
        float zero = 0.0;
        float quotient = one / zero; // Script run-time error: Math Error
        llOwnerSay((string) quotient);
    }
}
default
{
    state_entry()
    {
        list entries = [0];
        while (TRUE)
        {
            entries += entries; // Script run-time error: Stack-Heap Collision
            llOwnerSay((string) llGetListLength(entries));
        }
    }
}

Komunikaty błędów podczas kompilacji

Interfejs użytkownika SL może nie przyjąć kodu, który uważasz za poprawny, wyświtlając komunikat ERROR i następnie komunikat z wyjaśnieniem problemu.

ERROR : Type mismatch

You must name the .x .y .z .s components of a vector or rotation that you're assigning, you can't assign them all at once from a list, for instance: Musisz nazwać wprost składowe .x .y .z .s wektora lub obrotu, nie można ich przypisać wszystkich naraz z listy. Np:

default
{
    state_entry()
    {
        vector vec = (vector) [1, 2, 3]; // ERROR : Type mismatch
        llOwnerSay((string) vec);
    }
}

ERROR : Byte code assembly failed -- out of memory

Każdy z twoich skryptów musi być odpowiednio mały.

Np. kompilator może zgłosić ten błąd jeżeli zagnieździłeś zbyt dużo konstrukcji if-else-if:

demoElseIfCompileError(integer count)
{
    if (count == 0)
    {
        ;
    }
    else if (count == 1)
    {
        ;
    }
    else if (count == 2)
    {
        ;
    }
    ...
    ... // ERROR : Byte code assembly failed -- out of memory
    ... // or ERROR : Syntax error
    ...
    else if (count == ...)
    {
        ;
    }
}

Nie da się jednoznacznie określić jak mały powinien być skrypt. Dla przykładu w sierpniu 2007 roku różnica pomiędzy poszczególnymi klientami SL dochodziła do 30 razy. Klient pod Windows akceptował do 22 if-else'ów, podczas gdy klient na Mac OS X pozwalał na 692 takie konstrukcje.

Ograniczenia kompilacji w różnych systemach operacyjnych mogą działać jak swego rodzaju system ochrony przed kopiowaniem. Każdy rezydent może uruchomić skrypt skompilowany na bardziej "wybaczającym" komputerze, ale ci z bardziej ograniczonymi systemami nie będą mogli zapisać zmian w źródłowym skrypcie.

Zobacz llGetFreeMemory, llMessageLinked.

ERROR : Syntax error

Musisz zastosować składnię i pisownię która będzie odpowiadała kompilatorowi ;-)

Ten błąd może też być spowodowany, podobnie jak poprzedni, zbyt dużym skryptem. Patrz opis poprzedniego błędu, z uwagą, że czasami nawet mniejsze ilości zagnieżdżeń generowały błąd "Syntax error" w zależności od innych szczegółów kodu źródłowego.

Programiści, którzy uczyli się na mniej ograniczonej wersji kompilatora mogą uznać tego typu ograniczenia za rozsądne (ok 500 zagnieżdżeń na Mac'u), podczas gdy inni mogą uznać je za zbyt restrykcyjne (niewiele ponad tuzin zagnieżdżeń w Windows)