When you call lua_next
, the second argument should be the index of the table. Since you’re just pushing the table onto the stack with
lua_getglobal(L, "level");
after that call your stack will look like
-1: table "level"
(not +1
, since the stack is read going down). Then you call
lua_pushnil(L);
so your stack will be
-1: key (nil) -2: table "level"
Your table is at -2
, so when you call lua_next
, you should use the index -2
. Finally, after each iteration, your stack should look like:
-1: value -2: key -3: table "level"
So you want to read the value (at -1
) and then pop it (so just pop once), and then call lua_next
to get the next key. So something like this should work:
lua_getglobal(L, "level");
lua_pushnil(L);
while(lua_next(L, -2)) { // <== here is your mistake
if(lua_isnumber(L, -1)) {
int i = (int)lua_tonumber(L, -1);
//use number
}
lua_pop(L, 1);
}
lua_pop(L, 1);
Edit based on your second edit
Since it works when you remove external stuff, but doesn’t when you add it back in, my best guess is that you’re corrupting the stack somehow (either the C++ stack or the lua stack). Look really carefully at your pointers, especially when you manipulate the lua state.