Lua C API 嵌套表段。过错
Posted
技术标签:
【中文标题】Lua C API 嵌套表段。过错【英文标题】:Lua C API nested tables seg. fault 【发布时间】:2014-09-23 02:47:46 【问题描述】:我想用 Lua C API 创建一个简单的嵌套表。表被 mysql 结果填满。但是,当我尝试读取表格时,我的应用程序崩溃了。
代码:
int i = 0;
lua_newtable(L);
while(row = mysql_fetch_row(result))
lua_newtable(L);
lua_pushliteral(L, "event");
lua_pushnumber(L, atoi(row[0]));
lua_pushliteral(L, "timestamp");
lua_pushnumber(L, atoi(row[1]));
lua_settable(L, -5);
lua_rawseti(L, -2, ++i);
上面应该会产生一个 Lua 表:
event = 1, timestamp = 1234567890,
event = 2, timestamp = 1234567890,
event = 2, timestamp = 1234567890,
[..]
GDB 回溯 sn-p:
(gdb) bt
#0 luaH_getnum (t=0x3c7db040, key=1) at ltable.c:444
#1 0x0825f94e in luaH_setnum (L=0x3c7d5ca0, t=0x3c7db040, key=1) at ltable.c:500
#2 0x08257fd5 in lua_rawseti (L=0x3c7d5ca0, idx=-2, n=1) at lapi.c:593
这里有什么问题?
【问题讨论】:
【参考方案1】:您的代码只调用一次lua_settable
,但您想将"event"
和"timestamp"
添加到表中:
int i = 0;
lua_newtable(L);
while(row = mysql_fetch_row(result))
lua_newtable(L);
lua_pushliteral(L, "event");
lua_pushnumber(L, atoi(row[0]));
lua_settable(L, -3); //Set event
lua_pushliteral(L, "timestamp");
lua_pushnumber(L, atoi(row[1]));
lua_settable(L, -3); //changed `-5` to `-3`
lua_rawseti(L, -2, ++i);
你可以使用lua_setfield
来简化代码:
int i = 0;
lua_newtable(L);
while(row = mysql_fetch_row(result))
lua_newtable(L);
lua_pushnumber(L, atoi(row[0]));
lua_setfield(L,-2,"event");
lua_pushnumber(L, atoi(row[1]));
lua_setfield(L,-2,"timestamp");
lua_rawseti(L, -2, ++i);
最后,使用luaL_checkstack
确保您有足够的工作堆栈:
luaL_checkstack(L,3,nullptr);
int i = 0;
lua_newtable(L);
while(row = mysql_fetch_row(result))
lua_newtable(L);
lua_pushnumber(L, atoi(row[0]));
lua_setfield(L,-2,"event");
lua_pushnumber(L, atoi(row[1]));
lua_setfield(L,-2,"timestamp");
lua_rawseti(L, -2, ++i);
【讨论】:
太棒了! :) 谢谢。 @lhf 在这种情况下弹出(另一个)堆栈有什么意义?以上是关于Lua C API 嵌套表段。过错的主要内容,如果未能解决你的问题,请参考以下文章