【问题标题】:How to return two or more tables from lua function?如何从 lua 函数返回两个或多个表?
【发布时间】:2011-11-20 09:30:20
【问题描述】:

如果有人向我解释当从 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

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

【问题讨论】:

    标签: c++ c binding lua


    【解决方案1】:

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

    while 循环之后的lua_pop 将顶部表从堆栈中弹出。

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

    【讨论】:

    • 我知道这个循环永远不会终止 :) 所以如果我猜对了,我只需要做同样的操作来获取另一个表,在将当前表从堆栈中弹出后,第二个将替换它。非常感谢:)
    猜你喜欢
    • 2018-11-24
    • 2012-09-30
    • 2016-09-27
    • 2014-06-23
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多