我試圖從Lua加載表到C++,但我很難得到它的權利。 我正在通過第一次迭代很好,但隨後在第二次調用 lua_next它崩潰。有任何想法嗎?從C++迭代通過Lua表?
的Lua文件:
level = { 1, 2, 3, }
C++文件 - 首先,我這樣做:
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);
最後這個:
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);
然後我從reference manual嘗試
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...
自然L是一個lua_State *,我正在初始化它並解析該文件。
編輯: 針對傑西·貝德爾答案我想這個代碼,用記錄儀,但我仍然無法得到它的工作。
這給了這樣的輸出:
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
一切你說,傑西,似乎是正確的。但它仍未能進入下一次迭代。
EDIT2: 我想確切的代碼複製到一個新的項目,跳過所有周圍的類和東西我也懶得在這裏和那裏它的作品包括。但是在這裏它不會,而且只會在一個叫做lua_next的節目中生存下來。
編輯3: 我已經縮小了一點點。我使用hge作爲我的2D引擎。 我把功能測試的所有以前的代碼:
test(); //works
if(hge->System_Initiate())
{
test(); //fails
hge->System_Start();
}
據我瞭解HGE不LUA做任何事情。 Here是我做的小測試的源代碼。 hge 1.81的來源是here。
編輯4: 問題的大小越來越失控,但它無法幫助。這是我能夠減少到的最小代碼。
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;
}
所以第二次調用'lua_next'崩潰?這很奇怪......你有任何關於崩潰的調試信息(比如崩潰的地方)?此外,爲了確保事情正常工作,您應該在每一步都記錄密鑰(它也應該是一個數字)並編輯此答案 – 2009-09-17 15:50:26
我添加了lua_next的返回值。我沒有任何調試信息,我真的不知道如何添加它... – Jonas 2009-09-17 16:25:33
第二次編輯是一個提示 - 檢查我的回答編輯 – 2009-09-17 19:26:17