【问题标题】:Tracking Lua tables in C在 C 中跟踪 Lua 表
【发布时间】:2009-12-29 09:51:07
【问题描述】:

我有 C++ 对象和Lua 对象/表。 (还有SWIG C++ 绑定。)

我需要做的是将这两个对象关联起来,这样如果我说的话

CObject* o1 = getObject();
o1->Update();

它将执行等效的 Lua:

myluatable1.Update();

到目前为止,我可以想象 CObject::Update 将具有以下代码:

void CObject::Update(){
    // Acquire table.

    // ???

    // Do the following operations on the table.
    lua_getfield(L, -1, "Update");
    lua_pcall(L, 0, 0, 0);
}

我将如何存储/设置要使用的 Lua 表,以及上面的 // ??? 中的哪些内容可以使 Update 调用正常工作?

【问题讨论】:

  • 可以为 c++ 对象分配一个整数 id,并将关联表存储在全局 lau 表中,即 globaltable[tableID] = associatedTable?

标签: c++ c lua swig


【解决方案1】:

我不敢相信没有人注意到这一点!

http://www.lua.org/pil/27.3.2.html

Lua API 的一部分,用于存储对 lua 对象和表的引用,并返回用于存储在 C 结构中的引用!!

【讨论】:

  • 能否请您继续使用此部分。我正在努力做到这一点,但在实施方面有点挣扎。你有一个简短的例子可以展示吗?我将不胜感激!谢谢。
  • 那行代码本质上是从 c++ 上下文调用 lua: ai:Init()
  • 谢谢,但我正在寻找一个将引用 id 存储到 lua 表,然后将其推回堆栈的示例。我想出了如何做到这一点。感谢您的跟进!
  • +1 这与文档的前一部分一起帮助我朝着正确的方向前进:lua.org/pil/27.3.1.html,其中谈到了注册表。请注意,注释中的链接示例现在指向一个空行。
【解决方案2】:

我很好奇这种“反向 SWIG”的原因......

Lua 中的对象存在于 Lua 上下文中,因此您至少需要在对象中存储“L”。

传递“表指针”的问题有点微妙——尽管 Lua 允许从 Lua 堆栈中检索指针(使用 lua_topointer()),但无法将其放回去。理解 - 因为否则还需要检查指针是否指向有效对象等。

但是,您可能会做的是将对表的引用存储在全局表中,索引是 lightuserdata,是指向您的对象的指针。然后通过获得 Lua 状态和全局数组的名称,您可以检索对表的引用并将其推送到该上下文的 Lua 堆栈中。

这是粗略的,我什至还没有触及这个构造的垃圾收集问题。

但无论如何,这在性能方面不会是速度赛车手,在我看来,这就像很多样板 C++ 代码。我会尝试重新考虑这种方法,并将您想做的一些事情推到 Lua 域中。

附言看起来这是第三个问题,几乎是前两个问题的欺骗,herehere 是前两个问题。如果没有完全回答这些问题,最好编辑它们/添加赏金以累积答案。

【讨论】:

  • 这 3 个问题有它们的区别,尽管它们具有相同的最终目标,我可以在一个解决问题的项目中将所有这些转移到纯 lua 中,但是对于另一个项目,这需要我重写大片项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 2020-10-21
  • 2011-04-06
  • 2012-08-28
  • 2012-05-27
相关资源
最近更新 更多