Lua函数如何返回多个表格?
2018-6-15 2:0:53
收藏:0
阅读:106
评论:1
我正在尝试将多个浮点数组从C ++发送到Lua函数作为参数,然后从函数返回多个表格,以便我可以将它们再次用作C ++中的浮点数组。
因此,我的Lua函数将如下所示:
function perform(arg1, arg2)
local ret1, ret2 = {}, {}
for i=1, #arg1 do
ret1[i] = arg1[i] * 0.2;
ret2[i] = arg2[i] * 0.3;
end
return ret1, ret2
end
这是我在C ++中发送和返回多个表格的方式:
lua_getglobal(L, "perform");
for (int i=0; i<numArgs; ++i) {
lua_newtable(L);
float *in = reinterpret_cast<float*>(w[i]);
for (int j=0; j<64; ++j) {
lua_pushinteger(L, j+1);
lua_pushnumber(L, in[j]);
lua_settable(L, -3);
}
}
lua_call(L, numArgs, numRets);
for (int i=0; i<numRets; ++i) {
float *out = reinterpret_cast<float*>(w[numArgs+i]);
for (int j=0; j<64; ++j) {
lua_pushinteger(L, j+1);
lua_gettable(L, -2);
out[j] = lua_tonumber(L, -1);
lua_pop(L, 1);
}
//如何检测下一个返回的表格?
}
但是,如果我尝试这段代码,返回的数组具有相同的值。
我认为这是因为我没有正确获取返回的表格。
请问有谁能够教我如何正确获取多个返回的表格呢?
P.S:我也想知道是否可以优化我的代码以获得更好的性能。
编辑:将多个子表格传递并返回一个包含多个子表格的表格是否更快(更高效)? 如果是,我会感激任何人能够教我如何做到这一点。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我不知道你在这里尝试做什么,但是从函数返回的第二个表格可以很容易地在堆栈上访问。您只需在堆栈索引上执行一些算术运算即可到达正确位置。
这些
reinterpret_casts看起来对我来说非常可疑。您很可能做错了什么。#include <iostream> #include <vector> #include <lua.hpp> int main(int argc, char *argv[]) { lua_State *L = luaL_newstate(); luaL_openlibs(L); if (argc != 2) { std::cerr << "Usage: " << argv[0] << " <script.lua>\n"; return 1; } luaL_dofile(L, argv[1]); // Mock data int numArgs = 2; int numRets = 2; std::vector<float> w1(64, 1.0f); std::vector<float> w2(64, 1.0f); std::vector<float> w3(64, 1.0f); std::vector<float> w4(64, 1.0f); std::vector<float *> w = {w1.data(), w2.data(), w3.data(), w4.data()}; lua_getglobal(L, "perform"); for (int i = 0; i < numArgs; ++i) { lua_newtable(L); float *in = reinterpret_cast<float *>(w[i]); for (int j = 0; j < 64; ++j) { lua_pushinteger(L, j + 1); lua_pushnumber(L, in[j]); lua_settable(L, -3); } } lua_call(L, numArgs, numRets); for (int i = 0; i < numRets; ++i) { float *out = reinterpret_cast<float *>(w[numArgs + i]); for (int j = 0; j < 64; ++j) { lua_pushinteger(L, j + 1); lua_gettable(L, -2 - i); // Just some stack index arithmetic out[j] = lua_tonumber(L, -1); lua_pop(L, 1); } } lua_close(L); }