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

时间:2010-09-14 16:18:32

标签: c++ lua lua-c++-connection

我需要一个非常简单的c ++函数,它调用一个返回字符串数组的lua函数,并将它们存储为c ++向量。该函数可能如下所示:

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

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

有什么想法吗?

谢谢!

3 个答案:

答案 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提供类型,对智能指针的支持效果很好,并且(与其他项目相比)文档或多或少都很好。