【问题标题】:Reading and writing C struct from embedded lua从嵌入式 lua 读取和写入 C 结构
【发布时间】:2010-09-14 05:50:35
【问题描述】:

我想嵌入 lua 以允许在我的 C++ 应用程序中编写脚本。特别是,我有两个结构,我想将它们作为参数传递给给定的 lua 函数。一个是只读的,另一个是读/写的。这些结构的高度简化示例如下:

struct inData
{
    int x;
    int y;
    //many other fields follow
};

struct outData
{
    int a;
    double b;
    //other fields follow
};

这两个结构都是在 C++ 代码中创建的,并且在调用 lua 函数之前和之后都会在那里处理。如何将这些结构传递给 lua 函数,以便该函数可以执行以下操作:

if(inData.x > 5) then outData.a = 1 end

并让 outData 实例在从 lua 函数返回后实际保留更改?

【问题讨论】:

    标签: c++ struct lua


    【解决方案1】:

    无聊 + 样板 + 多语言 = SWIG。

    http://www.swig.org/Doc1.3/Lua.html#Lua_nn13

    【讨论】:

    • 所以这似乎会为结构等生成包装器。我仍然不清楚将现有结构从 C 传递到 lua。在链接的示例中,结构是在 lua 函数中实例化的,这不是我想要做的。
    • “23.3.9 指针、引用、值和数组”部分讨论了返回由 C++ 代码创建的结构,无论是通过指针还是通过值。这满足您的要求吗?
    • 另外stackoverflow.com/questions/884435/… 这里实际上有很多关于 SO 的 C++/Lua/SWIG 问题,可能值得您花时间阅读其中的一些。
    • 对不起,我可能没有很好地解释自己或误解了它的工作原理。该部分 also 显示了在 lua 代码中创建的对象。我在问如何将我的 C 代码中的现有结构实例(比如说在 main 内部)传递给一个 lua 函数,然后该函数将读取和或写入这个结构实例。我不清楚如何从 C 中推送这个实例以使其在 lua 中可用。
    • 我说的是该部分的最后一段,其中 C++ 函数分配一个结构并通过指针将其返回给 Lua。
    【解决方案2】:

    您还可以创建一个反映相同数据结构的 Lua 表,用于在 C 和 Lua 之间传递信息。

    【讨论】:

    • 所以你建议我将每个属性名称和值推送到 lua 的堆栈中以创建一个 lua 表,然后将它们全部拉出并在函数返回后将它们复制回结构中?如果是这样,那似乎是非常低效的。如果没有,您能否详细说明一下这个建议?
    • 是的,这就是我的建议。至于性能,这取决于使用情况。在我看来,访问用户数据中每个结构字段的 C 回调将需要更多的总开销,而不是简单地将值复制到前面的 Lua 状态。
    【解决方案3】:

    您可以使用 userdata 并将 outdata* 放入其中。您可以在它们上设置自定义函数,包括元表。我不打算通过它,因为它是太多样板/胶水代码。基本上,你在堆上创建 outdata,你让轻用户数据指向它(通过一个令人难以置信的邪恶演员),然后你设置一个自定义元表并使用 __index 通过自定义函数进行数据访问。

    基本上,这是可行的,但很无聊。也很危险,因为 Lua 不理解任何 C(或 C++)类型,而且你一直在处理 void*s。

    【讨论】:

    • 一条评论 - 轻用户数据 does not have individual metatable。这样做的常用方法是创建完整的用户数据,其大小为 sizeof(void*),并包含指向原始结构的指针。完整的用户数据可以有一个自定义的元表——评论的其余部分都适用,除了关于无聊和大量样板代码的评论——根据我的经验,它比其他一些语言要好得多。
    • @MikKy:关于用户数据,你是对的。我停止使用 Lua 是有原因的,因为 API 和语言限制毫无意义。至于其他一些语言,我真的会不寒而栗地想象你遇到的那些涉及比 Lua 样板更繁琐的重复代码。
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多