首页 > 解决方案 > 如何从 Lua C API 中的函数获取多个返回值?

问题描述

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

卢阿代码:

function test(a, b)
  return a, b -- I would like to get these values in C++
end

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

/* push functions and arguments */
lua_getglobal(L, "test");  /* function to be called */
lua_pushnumber(L, 3);   /* push 1st argument */
lua_pushnumber(L, 4);   /* push 2nd argument */

/* call the function in Lua (2 arguments, 2 return) */
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);

我得到的结果:

返回:4 4

我期望的结果:

返回:3 4

标签: c++clua

解决方案


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");  /* function to be called */
lua_pushnumber(L, 3);   /* push 1st argument */
lua_pushnumber(L, 4);   /* push 2nd argument */

|     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结果,第一个结果将在 index 处-n,最后一个在 index 处-1。” Lua 编程:25.2

2)在推送结果之前,lua_pcall从堆栈中删除函数及其参数。” Lua 编程:25.2


推荐阅读