5

我正在考虑将 Lua 嵌入到我正在开发的 C++ 应用程序中。我的意图是使用 Lua 编写脚本,为某些给定的输入执行哪些有序操作,即。在 c++ 程序中接收一个新的工作项,将详细信息传递给 Lua 后端,Lua 回调到 c++ 中执行必要的工作,返回完成的结果。

涉及的主要数据结构是一个大型(大约 80 多个成员)struct。我(非常)是 Lua 新手,我不确定如何将它传入和传出我的主机应用程序和嵌入式 Lua 状态。

到目前为止,我认为我的选择是:

a) 在 C++ 和 Lua 之间交叉时,将所有单独的数据成员推入/弹出堆栈(听起来很乱)。

b)构造一个表并填充值,然后将其放入/退出堆栈(更简洁一些)。

c)将它作为userdata(轻/重?)传递(我对此很粗略,不确定是否/如何从Lua端访问它以查询哪些操作是必要的)。

任何指导将不胜感激。

4

4 回答 4

4

如果我没记错的话,轻量级用户数据实际上只是一个指针。它们都共享相同的元表。它们主要用于传递 C 数据的地址。
如果您必须从 Lua 端访问完整的用户数据,它可能更接近您的需要。例如,它们的元表将允许您像访问常规 Lua 表一样访问它。

您可能还对 Roberto 的库感兴趣,该库用于在 Lua 5.1 与 C 结构之间转换数据。或不。取决于您的需求... :-)

于 2008-11-12T11:00:48.077 回答
3

我自己没有这样做(自从我使用 Lua 以来已经有好几年了,而且我从未以嵌入式方式使用过),但我认为您应该研究元表和 userdata 类型。该手册对用户数据值进行了说明:

这种类型对应于一块原始内存,在 Lua 中没有预定义的操作,除了赋值和身份测试。但是,通过使用元表,程序员可以为用户数据值定义操作(参见第 2.8 节)。用户数据值不能在 Lua 中创建或修改,只能通过 C API

听起来差不多。

于 2008-11-12T07:33:09.463 回答
1

将整个表示暴露给 Lua 可能不是您想要的。也许你只暴露了几个操作?然后使用指向结构的指针作为轻用户数据。它不能有元表,因此您必须使用显式函数。

如果您想公开所有内容,最好的办法可能是推送仅包含指向结构的指针的完整用户数据。这意味着额外的间接级别——从性能的角度来看,会迷失在噪音中,但很容易出错,所以在跨越 C++/Lua 边界的地方保持单一的事实。

使用完整的用户数据,您可以使用宏(太可怕了!)为每个字段放置 gettter 和 setter 函数。这需要手工完成很多工作,您可能更喜欢查看 tolua++,即使它带有很多包袱。

转到 Lua 邮件列表!

于 2008-11-28T21:02:15.437 回答
0

如果我在你那里,我会传递一个对结构的引用,然后让 Lua 调用 C 函数来修改它。这也意味着与 Lua 必须了解底层系统的所有细节相比,您可以更轻松地升级系统。

于 2009-07-22T05:57:49.710 回答