2015-05-18 5 views
7

Używam Lua jako języka skryptowego w mojej grze (C++). W jednej rozmowy (z lua do C++) I sprawdzić, jakiego typu jest na szczycie stosu:W języku C++ wywołanym przez Lua, lua_type (L, 0) zwraca 9, który nie jest udokumentowany.

if(lua_type(L, (0)) == LUA_TSTRING) 

ale czasami lua_type (L, (0)) zwraca 9.

nie mogę wydaje się znaleźć jakiekolwiek odniesienia do tego (zwracane wartości powinny zawierać się między -1 a 8 lub LUA_TNONE, LUA_TNIL, ... LUA_TTHREAD).

Co się dzieje?

+0

Znalazlem o następujących lobject.h: '/ * ** dodatkowych elementów dla osób nie wartościami */ #define LUA_TPROTO \t LUA_NUMTAGS #define LUA_TUPVAL \t (LUA_NUMTAGS + 1) #define LUA_TDEADKEY \t (LUA_NUMTAGS + 2) ' Gdzie' LUA_NUMTAGS' jest 9 –

Odpowiedz

5

W górnej stosu jest indeksem -1, nie 0.

0 nie może być stosowany jako wskaźnik dla dostępu do stosu:

(Wartość 0 nie jest dopuszczalny indeks .)

w §4.3 – Valid and Acceptable Indices w instrukcji obsługi.

C API w Lua nie trzymać rękę programisty:

Jak w większości bibliotek C, funkcje API Lua nie sprawdzić swoje argumenty dla ważności lub konsystencji. Można jednak zmienić to zachowanie, kompilując Lua z definicją makra LUA_USE_APICHECK. [§4]

+1

Mimo to dokumentacja mówi, że 'LUA_TNONE' powinien być tym samym wynikiem, ale' LUA_TNONE' ma wartość -1, a nie 9. Możliwe, że rozważ ten scenariusz (nieistniejący zamiast po prostu "nieważny" indeks), aby nawet go nie pokryć przypadek rror i jako taki staje się UB. Wygląda to na kiepskie kodowanie, jeśli to prawda. –

+2

Chociaż zgadzam się, że nie wyjaśnia to dokładnej wartości zwrotu po tym, jak uderzysz niezdefiniowane zachowanie, wszystko jest do przyjęcia, a "lua_type" jest wyraźnie udokumentowane jako zdefiniowane dla "akceptowalnego ind [lices]" lub ("valid" lub "non -odpowiedni (ale akceptowalny) ind [ices] ". –

+0

@LightnessRacesinOrbit Zdajesz sobie sprawę, że zbiór osób składających się na" oni "pod względem lua jest zbiorem zawierającym lhf, prawy? =) –

Powiązane problemy