【问题标题】:Passing structure address from C to Lua and accessing its contents in Lua without copy of data将结构体地址从 C 传递到 Lua 并在 Lua 中访问其内容而无需复制数据
【发布时间】:2012-12-24 18:32:38
【问题描述】:

假设我有一个数据包(网络数据包),它存储在 C 中的一个数组中。我在 Lua 中有一个可以处理这个数据包的模块。现在我需要将此数据包传递给 Lua 进行处理。我想避免复制数据。为此,我可以使用 userdatalightuserdata。但是在这种情况下,基地址将被推到堆栈顶部,我需要在 Lua 中编写回调或在 C 中为其编写元表。

我在如何开始用 C 编写一个基本的小回调时遇到了困难。我所需要的只是假设我有一个如下结构:

struct abc_{
    int a;
    int b;
    char* c;
} abc_t;

int arr1[] = {'100', '2', '4' , '5', '6'};

现在我有一个包含一些数据的数组。在 C 语言中,我可以使用这种结构对该数组进行类型转换以获取特定值。

abc_t *test;
test = (abc_t *)arr1;

我如何在 Lua 中做同样的事情,我在堆栈顶部传递了 arr1 的地址并且结构是在 C 中定义的?如何在没有副本的情况下在 Lua 中获取变量 ab 的值?

问题 2

假设我使用 C 并使用 Lua 堆栈来处理数组。

如果我想访问a[2],其中a 是我的表,2 是索引,那么2 需要位于堆栈顶部,我需要在堆栈中传递a 的位置作为lua_gettable() 的第二个参数。我怎样才能对 结构 做同样的事情?我想访问结构的特定元素。该怎么做?

【问题讨论】:

  • 我不认为你可以通过这个演员获得价值。你知道abc_t的内存布局吗?指针c 将在转换后无效。 int '100' 有什么价值?

标签: c lua stack luabind


【解决方案1】:

如果您不想将结构数据从 C 复制到 Lua,则需要将指向结构实例的指针装箱到具有专用元表的完整 userdata 中。轻量级用户数据对于这种用法不够灵活,因为您无法为其分配元表。

元表应该定义__index__newindex 元方法。如果 Lua 传递的索引是"a""b""c",则元方法返回或分配对应的结构体字段。 __gc 元方法可以在结构实例上调用free__tostring 元方法总是适合调试。

如果您按照问题标签的建议使用 luabind,则该库能够为您生成元表。也可以手写绑定。

要回答您的第二个问题,如果您按照建议定义 __index,您可以通过首先将 userdata 压入堆栈,然后将字段名称作为字符串压入,然后使用lua_gettable。函数lua_getfield 提供了一个快捷方式。

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2012-05-27
    • 2010-10-02
    • 2011-04-09
    • 2012-11-08
    • 2012-07-25
    相关资源
    最近更新 更多