如何在 Lua C API 中从函数中获取多个返回值?

我想知道如何在 Lua C API 中从函数中获取多个返回值。

Lua 代码:

function test(a, b)
  return a, b -- 我想在 C++ 中获取这些值
end

C++ 代码: (调用函数的部分)

/* 推送函数和参数 */
lua_getglobal(L, "test");  /* 要调用的函数 */
lua_pushnumber(L, 3);   /* 推送第一个参数 */
lua_pushnumber(L, 4);   /* 推送第二个参数 */

/* 在 Lua 中调用函数 (2 个参数, 2 个返回值) */
if (lua_pcall(L, 2, 2, 0) != 0)
{
    printf(L, "error: %s\n", lua_tostring(L, -1));
    return;
}
int ret1 = lua_tonumber(L, -1);
int ret2 = lua_tonumber(L, -1);
printf(L, "returned: %d %d\n", ret1, ret2);

我得到的结果:

returned: 4 4

我期望的结果:

returned: 3 4

点赞
用户5470596
用户5470596

lua_tonumber 并不会改变 lua_State 堆栈。你需要在两个不同的索引1上读取它:

int ret1 = lua_tonumber(L, -2);
int ret2 = lua_tonumber(L, -1);
printf(L, "returned: %d %d\n", ret1, ret2);

在调用 test 之前,你的堆栈看起来像这样:

lua_getglobal(L, "test");  /* 要调用的函数 */
lua_pushnumber(L, 3);   /* 推入第一个参数 */
lua_pushnumber(L, 4);   /* 推入第二个参数 */

|     4     |  <--- 2
+-----------+
|     3     |  <--- 1
+-----------+
|    test   |  <--- 0
+===========+

调用后2:

lua_pcall(L, 2, 2, 0)

+-----------+
|     3     |  <--- -1
+-----------+
|     4     |  <--- -2
+===========+

另一种方法是在读取结果后手动弹出它:

int ret1 = lua_tonumber(L, -1);
lua_pop(L, 1);
int ret2 = lua_tonumber(L, -1);
lua_pop(L, 1);
printf(L, "returned: %d %d\n", ret1, ret2);

  1. “如果函数返回多个结果,则第一个结果将被首先推送;因此,如果有 n 个结果,则第一个结果将在索引 -n 上,最后一个结果在索引 -1 上。” 《Lua 程序设计》 : 25.2

  2. “在推送结果之前,lua_pcall 会从堆栈中删除函数及其参数。” 《Lua 程序设计》 : 25.2

2019-06-27 07:33:12
用户1810087
用户1810087

你两次使用了相同的索引:

int ret1 = lua_tonumber(L, -1);
int ret2 = lua_tonumber(L, -1);

栈按以下方式填充:

-- Lua
return a, b

+---+
| b | <-- 顶部("相对"索引-1)
+---+
| a | <-- -2
+---+

所以你的 C++ 代码应该是:

// 我不知道 ret1 或 ret2 应该是什么。
// 1 = 堆栈中的第一个,还是第一个返回值?
// 为了与 lua return a,b 保持一致,重命名为 a 和 b
int b = lua_tonumber(L, -1);
int a = lua_tonumber(L, -2);
// lua_pop(L, 2); // 不要忘记弹出值

来自 24.2.3 – 其他堆栈操作

[...]lua_gettop 函数返回堆栈中元素的数量,这也是顶部元素的索引。请注意,负索引 -x 等同于正索引 gettop - x + 1。[...]

这种负索引定位对于涉及堆栈访问的所有 Lua 函数都是有效的,包括 lua_tonumber。

2019-06-27 07:43:46