【问题标题】:passing a lua table from C++ to .Lua script将 lua 表从 C++ 传递到 .Lua 脚本
【发布时间】:2012-05-27 01:24:47
【问题描述】:

过去 6 个小时我一直在尝试解决这个问题!我无法到达任何地方:s

我希望能够在 c++ 文件中创建一个 lua 表,然后将其传递给一个 lua 脚本文件,该文件具有以下 lua 函数:

function MTable (t) 
local n=#t
    for i=1,n do 
      print(t[i]) 
    end
end

我动态创建了一个包含两个字符串的一维数组:

 lua_newtable(L);
 lua_pushstring(L,"10.10.1.1");
 lua_pushstring(L,"10.10.1.2");
 lua_rawseti(L,-3,2);
 lua_rawseti(L,-2,1);

所以现在我将桌子放在堆栈顶部。 我已经通过写这个来验证它: if( lua_istable(L,lua_gettop(L)))` 返回1,表示它是一个表。

然后我这样做了:

lua_getglobal(L, "MTable");    // push the lua function onto the stack

uint32_t   result = lua_pcall(L, 1, 0, 0);  //argument 1 is for the table
 if (result) {
 printf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
         exit(1);
}

所以我得到了那个错误: 运行脚本失败:尝试调用表值

请注意,该文件还有我从 c++ 成功调用的其他几个函数。

有人可以帮我解决这个错误吗?这可能是LUA的错误吗? cz 我非常正确地遵循了这些步骤......我猜!

【问题讨论】:

  • 这已在 Lua 邮件列表中被询问和回答。

标签: c++ lua luabind


【解决方案1】:

函数必须在堆栈中first,在args之前。

您可以:

  1. 在生成表之前将要调用的函数压栈,例如:

    lua_getglobal(L, "MTable");
    ...generate table on stack...
    int result = lua_pcall(L, 1, 0, 0);
    
  2. 按照现在的顺序执行,然后在执行 pcall 之前交换 arg 和函数:

    ...generate table on stack...
    lua_getglobal(L, "MTable");
    lua_insert (L, -2);   // swap table and function into correct order for pcall
    int result = lua_pcall(L, 1, 0, 0);
    

【讨论】:

  • 谢谢!它就像魔术一样工作!我还有一个问题,C 如何从 lua 中获取表?我编辑了 Lua 脚本以返回 t。所以到目前为止,lua 将 t 推入堆栈。 C怎么能接受呢?我读了另一个处理这个问题的线程,但我无法理解解决方案的一个词。我所知道的是我必须编写一个带有 Lua 状态参数的 C 函数,我不知道如何从那里继续!你知道吗?
猜你喜欢
  • 2013-07-24
  • 2020-07-06
  • 1970-01-01
  • 2014-08-28
  • 2011-01-14
  • 1970-01-01
  • 2011-11-10
  • 2011-09-05
  • 2010-10-24
相关资源
最近更新 更多