将结构地址从C传递到Lua并在Lua中访问其内容而不复制数据

时间:2012-12-24 06:17:18

标签: c lua stack luabind

考虑我有一个数据包(网络数据包),它存储在C中的数组中。我在Lua中有一个可以处理这个数据包的模块。现在我需要将此数据包传递给Lua进行处理。我想避免复制数据。为此,我可以使用 userdata lightuserdata 。但在这种情况下,基地址将被推到堆栈的顶部,我需要在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()的第二个参数。我如何为结构做同样的事情?我想访问结构的特定元素。怎么做?

1 个答案:

答案 0 :(得分:1)

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

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

如果您使用 luabind 作为问题标签建议,那么该库可以为您生成元数据。您也可以手工编写绑定。

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