【问题标题】:Reading Lua Table from C++从 C++ 读取 Lua 表
【发布时间】:2015-09-02 11:12:16
【问题描述】:

我已经为这个简单的事情尝试了很多替代方案,但无法让它发挥作用。我希望用户在第一步中从 Lua 定义一个表:

a={["something"]=10} -- key=something, value=10

然后,在第二步中,用户将从 Lua 中调用一个用 C++ 设计的函数:

b=afunction(a) -- afunction will be designed in C++

C++ 代码:

int lua_afunction(lua_State* L)
{

   int nargs = lua_gettop(L);
   if(nargs>1) throw "ERROR: Only 1 argument in the form of table must be supplied.";
   int type = lua_type(L, 1);
   if(type!=LUA_TTABLE) throw "ERROR: Argument must be a table";
   //Until here it works as expected
   lua_pushnil(L); //does not work with or without this line
   const char* key=lua_tostring(L,-2);
   double val=lua_tonumber(L,-1);

   return 0;
}

从代码lua_type(L,1) 可以看出,堆栈的底部是表本身。我假设在表的顶部,键将驻留在其顶部,值将位于其顶部。因此堆栈的高度为 3,其中 idx=-1 为值,idx=-2 为键。但是,似乎我既无法读取密钥(“某物”)也无法读取值(10)。任何想法表示赞赏。

【问题讨论】:

标签: c++ lua


【解决方案1】:

你需要在lua_pushnil(L)之后调用lua_next(L,-2)

您需要lua_next,因为显然您不知道表中的键。所以你要使用table traversal协议,就是push table,push nil,调用lua_next(L,-2),获取栈上的key和value。这是可行的,因为该表仅包含一对。

如果您知道表中的键,则可以直接调用 lua_gettablelua_getfield,而无需调用 lua_nextlua_pushnil

【讨论】:

  • 有效!但是,我不确定我是否理解lua_pushnil(L) 背后的逻辑,然后调用lua_next(L,-2)。显然,当lua_pushnil(L) 被调用时,表格停留在原处(堆栈底部),现在我们有一个空元素,因此堆栈高度为 2。lua_next 做什么?
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 2015-01-18
  • 2011-04-27
  • 2013-06-03
  • 2016-01-08
  • 2015-05-21
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多