我需要一个非常简单的c ++函数,它调用一个返回字符串数组的lua函数,并将它们存储为c ++向量。该函数可能如下所示:
std::vector<string> call_lua_func(string lua_source_code);
(其中lua源代码包含一个返回字符串数组的lua函数)。
有什么想法吗?
谢谢!
答案 0 :(得分:2)
以下是一些可能适合您的来源。它可能需要更多的润色和测试。它期望Lua块返回字符串数组,但稍作修改就可以调用块中的命名函数。因此,它原样使用"return {'a'}"
作为参数,但不是"function a() return {'a'} end"
作为参数。
extern "C" {
#include "../src/lua.h"
#include "../src/lauxlib.h"
}
std::vector<string> call_lua_func(string lua_source_code)
{
std::vector<string> list_strings;
// create a Lua state
lua_State *L = luaL_newstate();
lua_settop(L,0);
// execute the string chunk
luaL_dostring(L, lua_source_code.c_str());
// if only one return value, and value is a table
if(lua_gettop(L) == 1 && lua_istable(L, 1))
{
// for each entry in the table
int len = lua_objlen(L, 1);
for(int i=1;i <= len; i++)
{
// get the entry to stack
lua_pushinteger(L, i);
lua_gettable(L, 1);
// get table entry as string
const char *s = lua_tostring(L, -1);
if(s)
{
// push the value to the vector
list_strings.push_back(s);
}
// remove entry from stack
lua_pop(L,1);
}
}
// destroy the Lua state
lua_close(L);
return list_strings;
}
答案 1 :(得分:1)
首先,请记住Lua数组不仅可以包含整数,还可以包含其他类型的键。
然后,您可以使用luaL_loadstring导入Lua源代码。
此时,剩下的唯一要求是“返回向量”。
现在,您可以使用lua_istable
检查值是否为表(数组),并使用lua_gettable
提取多个字段(请参阅http://www.lua.org/pil/25.1.html)并将其逐个手动添加到矢量。
如果你无法弄清楚如何处理堆栈,似乎有一些tutorials可以帮助你。为了找到元素的数量,我找到了这个mailing list post,这可能会有所帮助。
现在,我没有安装Lua,所以我无法测试这些信息。但无论如何,我希望它有所帮助。
答案 2 :(得分:0)
不是你问题的答案:
编写c ++&lt; =&gt;时遇到了很多麻烦。 lua接口代码与普通的lua c-api。然后我测试了许多不同的lua-wrapper,我真的建议luabind如果你想要实现或多或少复杂的东西。可以在几秒钟内为lua提供类型,对智能指针的支持效果很好,并且(与其他项目相比)文档或多或少都很好。