2

考虑我有一个数据包(网络数据包),它存储在 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 中定义的?我怎样才能得到变量的值ab在没有副本的 Lua

问题2

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

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

4

1 回答 1

1

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

元表应该定义__index__newindex元方法。如果 Lua 传递的索引是"a","b""c",则元方法返回或分配对应的结构体字段。元__gc方法可以调用free结构实例,并且__tostring元方法总是有利于调试。

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

要回答您的第二个问题,如果您__index按照建议进行定义,您可以通过首先将用户数据推送到堆栈上,然后将字段名称作为字符串推送,然后使用lua_gettable. 函数为此提供了一个快捷方式lua_getfield

于 2012-12-24T10:32:38.230 回答