我说的对读嵌套表卢阿从C函数的参数?(Am I right to read a nested lua

2019-10-18 14:12发布

我要实现用C语言函数,将由Lua的脚本中调用。

这个功能应该得到一个Lua表(甚至包含数组)作为参数,所以我应该阅读table.I领域尝试做像下面,但是当我运行它,我的功能崩溃。 谁能帮我找到了问题?


/*
 function findImage(options)
    imagePath = options.imagePath
    fuzzy = options.fuzzy
    ignoreColors = options.ignoreColor;
    ...
 end

 Call Example:

 findImage {
              imagePath="/var/image.png", 
              fuzzy=0.5,
              ignoreColors={
                             0xffffff, 
                             0x0000ff, 
                             0x2b2b2b
                           }
            }

 */

static int findImgProxy(lua_State *L)
{
    lua_settop(L, 1);
    luaL_checktype(L, 1, LUA_TTABLE);

    lua_getfield(L, -1, "imagePath");
    lua_getfield(L, -2, "fuzzy");
    lua_getfield(L, -3, "ignoreColors");

    const char *imagePath = luaL_checkstring(L, -3);
    double fuzzy    = luaL_optint(L, -2, -1);

    int count  = lua_len(L, -1); // how to get the member count of ignoreColor array

    int colors[count];
    for (int i=0; i count; i++) {
        lua_rawgeti(L, 4, i);
        colors[i] = luaL_checkinteger(L, -1);
        lua_pop(L, 1);
    }

    lua_pop(L, 2);

    ...
    return 1;
}

Answer 1:

lua_len不返回任何东西,它只是推栈上的长度。 使用这个片段,以获得表的长度:

lua_len(L, -1);
int count = luaL_checkinteger(L, -1);
lua_pop(L, 1);


Answer 2:

int count  = lua_len(L, -1); // how to get the member count of ignoreColor array

int colors[count];
for (int i=0; i count; i++)
{
    colors[i] = luaL_checkinteger(L, -1-i);
}

造成这种情况的代码段看起来不正确(不去管在循环缺少对比操作)。 用于获取表长度进行正确的功能lua_objlen 。 它看起来像你想得出的数字出来“ignoreColor”,但你有没有第一把它们放在栈中。 其结果luaL_checkinteger(L, -1-i); 结束访问堆栈上的错误指数

你可能想要的东西更接近这个例如:

int count  = lua_objlen(L, -1);
std::vector<int> colors(count);
for (int i = 0; i < count; lua_pop(L, 1))
{
  lua_rawgeti(L, 4, ++i);
  colors.push_back( luaL_checkinteger(L, -1) );
}

如果您使用的Lua 5.2,更换lua_objlen有:

int count  = lua_rawlen(L, -1);

确保有堆栈上有足够的空间,如果你移动了很多从表元素。 例如。 lua_checkstack



文章来源: Am I right to read a nested lua table as argument from C function?