c++ - 如何从 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
解决方案
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
推荐阅读
- gis - 如何使用 arcgis Rest API 设置流程?
- php - Laravel,如何将密码重置为用户表中重复的电子邮件
- laravel - 如果数组大小很大,则无法在会话中存储数组 laravel 6
- plot - 无法使用散景 BoxSelectTool 访问选择
- python - Visual Studio Code 的调试器和 pipenv
- javascript - 如何通过 React 中的 api 数据进行映射?
- javascript - 如何使排行榜滑块横幅响应?
- javascript - 如何将图像添加到
标签来自 - javascript - 开玩笑:如何用期望值的子集测试 console.log haveBeenCalled?
- python-3.x - 是否需要提供 access_key 和 secret_key 才能在 lambda 函数中从 s3 访问对象?