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

如果有人能够解释一下当从C中调用Lua函数并返回两个表或是一个内部嵌套表时,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

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

原文链接 https://stackoverflow.com/questions/7473924

点赞
stackoverflow用户33252
stackoverflow用户33252

注意,当 lua_next 返回 0 时,它已经弹出了键,并且没有推入任何值,所以在 while 循环结束时,您在栈上有两个表。

在你的 while 循环之后的 lua_pop 弹出了栈顶的表。

随后的 for 循环从索引 -2 开始,超出了表的范围,可能包含任何东西。此外,for 循环将永远不会终止。

2011-09-19 17:11:59