如何从lua函数返回两个或多个表?

时间:2011-09-19 16:05:53

标签: c++ c binding lua

如果有人向我解释当lua函数从C调用后返回两个表或具有嵌套表的表时,我真的很感激lua-C堆栈的工作原理

当我尝试这样做时,它看起来似乎很好,但只是在第一眼看到:

if ( lua_istable(L, -1) )
        printf("its OK\n");

    if ( lua_istable(L, -2) )
        printf("its OK\n");

    lua_pushnil(L);

        while ( lua_next(L, -2) )
        {
            if(lua_isnumber(L, -1)) 
            {
                int i = (int)lua_tonumber(L, -1);
                const char *key = lua_tostring(L, -2); 
                printf("%d %s \n", i, key); 
            }
            lua_pop(L, 1);
        }
        lua_pop(L, 1);

在这种情况下,我收到两条消息,第一个表位于-1级,第二个表位于-2级,但是后来这段代码,当我试图获取下一个表时程序崩溃 当我检查表存在时的堆栈

for ( int i = -2; ; --i)
            if ( lua_istable(L, i) )
                printf("its %d OK\n", i);

我得到了以下结果:

its -233 OK
its -645 OK
its -1245 OK
its -1549 OK
its -2807 OK
its -2815 OK
its -2816 OK

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

请注意,当lua_next返回0时,弹出了键,并且没有任何推送,所以在while循环结束时,您的堆栈中有两个表。

lua_pop循环后while将顶部表格弹出堆栈。

后续for循环从索引-2开始,该索引超过表,并且可以包含任何内容。此外,for循环永远不会终止。