返回字符串向量的最简单的lua函数

我需要一个非常简单的 C++ 函数,调用一个 Lua 函数并将其返回的字符串数组存储为 C++ 向量。该函数的形式可以如下所示:

std::vector<string> call_lua_func(string lua_source_code);

(其中 lua 源代码包含返回字符串数组的 lua 函数)。

有什么想法吗?

谢谢!

原文链接 https://stackoverflow.com/questions/3710796

点赞
stackoverflow用户32775
stackoverflow用户32775

首先,记住 Lua 数组不仅可以包含整数,还可以使用其他类型作为键。

接下来,您可以使用 luaL_loadstring 导入 Lua 源代码。

此时,唯一剩下的要求是“返回向量”。 现在,您可以使用 lua_istable 检查值是否为表格(数组),并使用 lua_gettable 提取多个字段(参见 http://www.lua.org/pil/25.1.html)并逐个手动添加到向量中。

如果您无法弄清如何处理堆栈,似乎有一些教程可以帮助您。要查找元素数量,我发现这篇邮件列表帖子可能会有所帮助。

现在,我没有安装 Lua,因此无法测试这些信息。但我希望它有所帮助。

2010-09-14 16:43:12
stackoverflow用户445860
stackoverflow用户445860

并非您问题的答案:

我在使用普通的 lua c-api 编写 c++ <=> lua 接口代码时遇到了很多麻烦。然后我测试了许多不同的 lua-wrapper,并且我非常推荐 luabind,如果您试图实现任何更多或更少的复杂性。可以在几秒钟内将类型提供给 lua,支持智能指针表现良好,相比其他项目,文档更或多或少良好。

2010-09-14 17:29:14
stackoverflow用户173806
stackoverflow用户173806

下面是可能适合您的一些源代码。它可能需要稍微修改和测试。它预期Lua chunk将返回字符串数组,但是稍微修改即可调用块中的命名函数。因此,原样使用 "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;

  // 创建Lua状态
  lua_State *L = luaL_newstate();
  lua_settop(L,0);

  // 执行字符串块
  luaL_dostring(L, lua_source_code.c_str());

  // 如果只有一个返回值,并且值是一个表
  if(lua_gettop(L) == 1 && lua_istable(L, 1))
  {
    // 对于表中的每个条目
    int len = lua_objlen(L, 1);
    for(int i=1;i <= len; i++)
    {
      // 将条目压栈
      lua_pushinteger(L, i);
      lua_gettable(L, 1);

      // 将表条目作为字符串获取
      const char *s = lua_tostring(L, -1);
      if(s)
      {
        // 将值推送到向量中
        list_strings.push_back(s);
      }

      // 从堆栈中删除条目
      lua_pop(L,1);
    }
  }

  // 销毁Lua状态
  lua_close(L);

  return list_strings;
}
2010-09-19 05:11:42