Próbuję załadować tabele z Lua do C++, ale mam problemy z uzyskaniem tego poprawnie. Przechodzę przez pierwszą iterację dobrze, ale potem przy drugim wywołaniu lua_next to się zawiesza. Jakieś pomysły? PlikIterowanie przez tabelę Lua z C++?
Lua:
level = { 1, 2, 3, }
C++ plik - Najpierw zrobiłam to:
lua_getglobal(L, "level");
for(lua_pushnil(L); lua_next(L, 1); lua_pop(L, -2))
{
if(lua_isnumber(L, -1)) {
int i = (int)lua_tonumber(L, -1);
//use number
}
}
lua_pop(L, 1);
Potem próbowałem z reference manual:
lua_getglobal(L, "level");
int t = 1;
lua_pushnil(L);
while(lua_next(L, t)) {
printf("%s - %s",
lua_typename(L, lua_type(L, -2)),
lua_typename(L, lua_type(L, -1)));
lua_pop(L, 1);
}
lua_pop(L, 1);
i wreszcie to:
lua_getglobal(L, "level");
lua_pushnil(L);
lua_next(L, 1);
if(lua_isnumber(L, -1)) {
int i = (int)lua_tonumber(L, -1);
//use number fine
}
lua_pop(L, 1);
lua_next(L, 1); //crashes
etc...
Naturalnie L to lua_State * i ja go inicjuję i parsuję plik w porządku.
Edit: W odpowiedzi na Jesse Beder odpowiedź Próbowałem ten kod, z rejestratorem, ale nadal nie mogę zmusić go do pracy.
co dało następujący wynik:
stack size: 0
-1 is a table
-1 is now nil
-2 is now table
pred: 1
loop stuff
num: 1
stack size: 3
-3 is now table
stack size: 2
-2 is now table
Wszystko, co powiedział Jesse, wydaje się prawdziwe. Ale nadal nie udaje się przejść do kolejnej iteracji.
Edit2: Próbowałem skopiować dokładny kod do nowego projektu, omijając wszystkie okoliczne klas i rzeczy mi nie przeszkadzało to tu i tam to działa. Ale tutaj tak nie jest i przetrwa tylko jedno połączenie lua_next.
Edytuj3: Zawęziłem to nieco dalej. Używam hge jako mojego silnika 2D. umieścić cały poprzedni kod w teście funkcję:
test(); //works
if(hge->System_Initiate())
{
test(); //fails
hge->System_Start();
}
O ile mi zrozumieć HGE nic nie robi z lua. Here to kod źródłowy dla małego testu, który zrobiłem. Źródłem dla hge 1.81 jest here.
Edit4: Wielkość pytania wymyka się spod kontroli, ale nie można mu pomóc. Jest to najmniejszy kod, na jaki udało mi się go zredukować.
extern "C"
{
#include <lua/lua.h>
#include <lua/lualib.h>
#include <lua/lauxlib.h>
}
#include <hge\hge.h>
bool frame_func()
{
return true;
}
bool render_func()
{
return false;
}
void test()
{
lua_State *L = lua_open();
luaL_openlibs(L);
if(luaL_dofile(L, "levels.lua")) {
lua_pop(L, -1);
return;
}
lua_getglobal(L, "level");
lua_pushnil(L);
while(lua_next(L, -2)) {
if(lua_isnumber(L, -1)) {
int i = (int)lua_tonumber(L, -1);
//use number
}
lua_pop(L, 1);
}
lua_pop(L, 1);
lua_close(L);
}
int main()
{
HGE *hge = hgeCreate(HGE_VERSION);
hge->System_SetState(HGE_FRAMEFUNC, frame_func);
hge->System_SetState(HGE_RENDERFUNC, render_func);
hge->System_SetState(HGE_WINDOWED, true);
hge->System_SetState(HGE_SCREENWIDTH, 800);
hge->System_SetState(HGE_SCREENHEIGHT, 600);
hge->System_SetState(HGE_SCREENBPP, 32);
//test(); //works
if(hge->System_Initiate())
{
test(); //fails
hge->System_Start();
}
hge->Release();
return 0;
}
Więc drugie połączenie z 'lua_next' ulega awarii? To dziwne ... czy masz jakieś informacje na temat debugowania (np. Gdzie dokładnie się to zdarzyło)? Ponadto, aby upewnić się, że wszystko działa poprawnie, należy zalogować klucz na każdym kroku (powinien to być również numer) i edytować tę odpowiedź. –
Dodałem wartość zwracaną przez lua_next. Nie mam żadnych informacji na temat debugowania i tak naprawdę nie wiem jak go dodać ... – Jonas
Ta druga edycja to podpowiedź - sprawdź poprawkę na moją odpowiedź –