[英]Lua C API nested tables seg. fault
I want to create a simple nested table with Lua C API. 我想用Lua C API创建一个简单的嵌套表。 Table is getting filled with the mysql results. 表格填满了mysql结果。 However my app is crashing when I am trying to read the table. 但是,当我尝试阅读表格时,我的应用程序崩溃了。
Code: 码:
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);
}
The above should produce an Lua table: 上面应该生成一个Lua表:
{
{event = 1, timestamp = 1234567890},
{event = 2, timestamp = 1234567890},
{event = 2, timestamp = 1234567890},
[..]
}
GDB backtrace snippet: GDB回溯代码片段:
(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
What the wrong here? 这里有什么不对?
Your code only calls lua_settable
once, but you want to add both "event"
and "timestamp"
to the table: 您的代码只调用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);
}
You can simplify the code by using lua_setfield
: 您可以使用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);
}
Finally, make sure you have enough working stack with luaL_checkstack
: 最后,确保你有足够的工作堆栈与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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.