如何从 Lua 函数中获取多个返回表?
How to get multiple returned tables from Lua function?
我正在尝试将多个浮点数组从 C++ 发送到 Lua 函数作为参数,然后从函数发送 return 多个 table,这样我就可以再次将它们用作浮点数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++ 中发送和 return 多个 tables to/from Lua 函数的方式。
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);
}
//how to detect next returned table?
}
但是如果我尝试代码,returned 数组具有相同的值。
我认为这是因为我没有正确获取 returned tables。
有人可以教我如何正确地获得多个 returned tables 吗?
P.S: 我也想知道是否可以优化我的代码以获得更好的性能。
编辑:传递和 return 一个具有多个子 table 的 table 会更快(更有效)吗?如果是这样,如果有人能教我怎么做,我将不胜感激。
我不知道你想在这里做什么,但是从函数返回的第二个 table 在堆栈上很容易访问。您只需对堆栈索引执行一些运算即可到达正确的位置。
那些 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);
}
我正在尝试将多个浮点数组从 C++ 发送到 Lua 函数作为参数,然后从函数发送 return 多个 table,这样我就可以再次将它们用作浮点数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++ 中发送和 return 多个 tables to/from Lua 函数的方式。
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);
}
//how to detect next returned table?
}
但是如果我尝试代码,returned 数组具有相同的值。
我认为这是因为我没有正确获取 returned tables。
有人可以教我如何正确地获得多个 returned tables 吗?
P.S: 我也想知道是否可以优化我的代码以获得更好的性能。
编辑:传递和 return 一个具有多个子 table 的 table 会更快(更有效)吗?如果是这样,如果有人能教我怎么做,我将不胜感激。
我不知道你想在这里做什么,但是从函数返回的第二个 table 在堆栈上很容易访问。您只需对堆栈索引执行一些运算即可到达正确的位置。
那些 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);
}