如何通过轻量级用户数据对象从 Lua 传递表参数给 C++?

我已经注册一个函数,用于创建可以被 C++ 和 Lua 使用的轻量级用户数据。当我使用简单的变量、整数和字符串进行测试时,该部分正常工作。当我尝试使用表格时,它变得更加复杂。

std::string aString = lua_tostring(lua,-4);

参数是正确的,因为它应该是字符串。

if (lua_type(lua,-3 == LUA_TTABLE))  //为 true,说明它被识别为表格
{
    auto t = lua_gettable(lua, -3);

    size_t tableLen = lua_rawlen(lua, -3); // 也会给出正确的大小
    lua_settop(lua, 1); //这会丢弃剩余的值,我不想这样
    //luaL_checktype(lua, 1, LUA_TTABLE); //使用这种方法会崩溃应用程序,期望
//表格但是得到的是字符串
    lua_getfield(lua, 1, "a");
    lua_getfield(lua, 1, "b");
    lua_getfield(lua, 1, "c");
    lua_getfield(lua, 1, "d");
    lua_getfield(lua, 1, "e");
    std::cout << lua_gettop(lua) << std::endl; //使用 getfields 后我得到了正确的新表格大小
//(我认为它比预期多了一个值,我认为它是表格本身
    //int a = luaL_checkinteger(lua, -5); //这些不能按预期工作,因为它们期望数字但得到 nil
    //int b = luaL_checkinteger(lua, -4);
    //int c = luaL_checkinteger(lua, -3);
    //int d = luaL_checkinteger(lua, -2);
    //int e = luaL_checkinteger(lua, -1);
    std::cout << lua_tointeger(lua, -2) << std::endl; //始终返回 0

}

尝试忽略表格并获取堆栈的其余部分会导致违反错误在 0x000000,尽管第三个值正确地调试为期望的值,第四个值为空,即使不使用表格也会正确传递。

像这样进行是否可能?

欢迎指出正确的方向,并且如果我不知道表格的关键字应该使用什么?

点赞
用户5675002
用户5675002
如果 (lua_type(lua,-3 == LUA_TTABLE)) //是 true,所以我知道它把它识别为一个表

这里有一个严重的错误,或者你没有发布实际的代码。

你没有检查索引为-3的值的类型,而是询问索引为“false”的值的类型,因为“-3 == LUA_TTABLE”显然是“false”。

之后发生的任何崩溃都是这个错误的结果。它将把任何不是 'nil' 的东西识别为表。 
2019-02-24 16:55:52