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

标签 c++ c binding 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

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

最佳答案

请注意,当 lua_next 返回 0 时,键已弹出,但什么也没压,所以在 while 循环结束时,您有你的两个表在堆栈上。

while 循环之后的 lua_pop 将顶层表格弹出堆栈。

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

关于c++ - 如何从 lua 函数返回两个或多个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7473924/

相关文章:

c++ - 变量模板的编译器问题

c++ - Lemon Parser 会跳过一些东西(或者我的误解)

c++ - 使用 pthreads 时的后台线程(不错,优先级)

WPF DataGrid 同步列宽

javascript - jQuery 绑定(bind)提交导致问题

c++ - 为什么qt show()没有优先级?

c++ - 关于机器学习/计算机视觉领域实用方法的问题

xaml - 使用绑定(bind) XAML 连接字符串

c++ - 零长度位域的实际使用

c - 32 位处理器上的程序集标签地址不正确