2016-04-13 51 views
2

我正在使用Lua C API製作我自己的遊戲引擎。我得到了這樣的Lua表層次:使用Lua C API在子表中插入函數

my_lib = { 
    system = { ... }, 
    keyboard = { ... }, 
    graphics = { ... }, 
    ... 
} 

我也得到了一些C函數,我要註冊,這樣的事情:

inline static int lua_mylib_do_cool_things(lua_State *L) { 
    mylib_do_cool_things(luaL_checknumber(L, 1)); 
    return 0; 
} 

所以,我怎麼能註冊它像my_lib子成員桌子,就像那樣?

my_lib = { 
    system = { do_cool_things, ... }, 
    keyboard = { ... } 
    graphics = { ...} 
} 

現在我只知道註冊全局表格的成員的方式,它的工作原理類似:

inline void mylib_registerFuncAsTMem(const char *table, lua_CFunction func, const char *index) { 
    lua_getglobal(mylib_luaState, table); 
    lua_pushstring(mylib_luaState, index); 
    lua_pushcfunction(mylib_luaState, func); 
    lua_rawset(mylib_luaState, -3); 
} 

但對於子表?

+0

有[API函數(https://www.lua.org/manual/5.3/manual.html# luaL_setfuncs),它可以幫助將函數註冊到表格中,你使用的是哪個版本的Lua? – Adam

+0

感謝您的回覆。我正在使用Lua 5.1,看起來這裏沒有這樣的API函數。 –

+0

確實,這個函數是在Lua 5.2中添加的,但你也許可以使用[luaL_register](https://www.lua.org/manual/5.1/manual.html#luaL_register)。 – Adam

回答

2

一個簡單的方法將多個Lua C函數註冊到表中(使用Lua 5.1)是使用luaL_register

首先,執行你的Lua函數,它們應該採取lua_CFunction的形式。

static int graphics_draw(lua_State *L) { 
    return luaL_error(L, "graphics.draw unimplemented"); 
} 

static int system_wait(lua_State *L) { 
    return luaL_error(L, "system.wait unimplemented"); 
} 

接下來,創建一個luaL_Reg結構,每個子表的Lua函數及其名稱(鍵)。

static const struct luaL_Reg module_graphics[] = { 
    {"draw", graphics_draw},   
    // add more graphic functions here.. 
    {NULL, NULL} // terminate the list with sentinel value 
}; 

static const struct luaL_Reg module_system[] = { 
    {"wait", system_wait},   
    {NULL, NULL} 
}; 

然後,在你回到你的模塊表中創建的每個子表和register其功能的功能。

int luaopen_game(lua_State *L) {  
    lua_newtable(L); // create the module table 

    lua_newtable(L);       // create the graphics table 
    luaL_register(L, NULL, module_graphics); // register functions into graphics table 
    lua_setfield(L, -2, "graphics");   // add graphics table to module 

    lua_newtable(L);       // create the system table 
    luaL_register(L, NULL, module_system); // register functions into system table 
    lua_setfield(L, -2, "system");   // add system table to module 

    // repeat the same process for other sub-tables 

    return 1; // return module table 
} 

這應該導致具有以下結構的模塊表:

game = { 
    graphics = { 
     draw -- C function graphics_draw 
    }, 
    system = { 
     wait -- C function system_wait 
    } 
} 
+0

非常感謝。在我問這個問題後,我自己找到了解決方案,但是你的問題要複雜得多。 –

+1

不客氣。這種模式通常用於用C語言編寫的Lua模塊,如出色的[Lua編程](http://www.lua.org/pil/28.1.html)書中所示。第一版免費在線提供。 – Adam