【问题标题】:Lua C API nested tables seg. faultLua C API 嵌套表段。过错
【发布时间】: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

这里有什么问题?

【问题讨论】:

    标签: c++ arrays lua lua-table


    【解决方案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 在这种情况下弹出(另一个)堆栈有什么意义?
    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 2010-12-10
    • 2014-08-12
    • 2013-06-03
    • 1970-01-01
    • 2014-08-28
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多