如何使用Lua c API正确读取字符串和表参数?

时间:2018-11-02 15:15:57

标签: c++ lua

我花了几个小时试图使其无法成功运行。我有一个C ++程序,其功能公开给Lua脚本。 Lua脚本是这样使用的:

    setData('type', {a=1, b=2, c=3})

所以第一个参数是字符串,第二个参数是表。

我当前最好的C ++ setData函数版本如下:

    string sType;
    map<string, uint8_t> mOptions;

    int nArgs = lua_gettop(i_pState);
    if (nArgs == 2)
    {
        if (lua_isstring(i_pState, 1) != 0)
            sType = lua_tostring(i_pState, 1);

        if (lua_istable(i_pState, 2) != 0)
        {
            lua_pushnil(i_pState);
            while(lua_next(i_pState, 2))
            {
                uint8_t nValue = uint8_t(lua_tonumber(i_pState, -1));
                string  sKey   = lua_tostring(i_pState, -2);

                mOptions[sKey] = nValue;

                lua_pop(i_pState, 1);
            }
            lua_pop(i_pState, 1);
        }
    }

    return 0;

它工作正常,但随后在调用lua_close()函数时最终导致“ program.exe触发了断点”错误。 此代码有什么问题?

UPD1。不处理第二个参数就不会出错。

UPD2。我的代码表现得很奇怪。我认为这可能是将extern "C"和C ++代码混合在一起的问题。

UPD3。原来这是堆损坏。我不明白原因在哪里。可能这根本与lua无关。

1 个答案:

答案 0 :(得分:0)

最后!将Lua代码重新编译为C ++代码不起作用(肯定的是,我不必担心RSpec.describe Booking, type: :model do it { should belong_to(:user) } it { should belong_to(:ride) } )。但是我发现了两个多余的extern "C"调用。我删除了它们,现在工作正常。

我没想到Lua会如此危险!