Lua初学者:C-Lua如何从C语言传递结构体/缓冲区给Lua?

我遵循了这个样板示例:http://www.matrix44.net/blog/?p=456

我能够从 C 向 Lua 发送字符串,但是当我传递结构体(我使用了 lua_newuserdata)时,出现错误。

C 代码片段

//s = (ST*) malloc ( sizeof(ST) );
//    lua_pushlightuserdata(state, s);
s = lua_newuserdata(state, sizeof(ST));
s->a=11;
s->b=12;
printf ( "s = %p \n", s ); // Prints 0x80a708
result = lua_pcall(state, 0, LUA_MULTRET, 0);

Lua 代码片段

print(foo)  -->  Prints 0x80a708
io.write("received has:\n", foo.a); --> ERROR : Failed to run script: script.lua:1: attempt to index global 'foo' (a userdata value)

我如何将缓冲区转换为结构体/表记录?

最终,我的 C 程序不知道结构体,它只会将缓冲区传递给 Lua,Lua 知道结构体,并需要在那里转换。

谢谢, PS: 脚本和 C 程序的 printf 与 hex 相符(0x80a708),我可以直接转换吗?

点赞
用户1847592
用户1847592

用户数据内部无法从 Lua 代码中访问。

使用表格将结构体从 C 传递到 Lua 中。

或通过元表手动为您的用户数据定义索引。

2013-03-13 21:09:50
用户1177100
用户1177100

Lua 没有结构体,它只有表格(tables)。

Userdata 是将不透明的数据传递给 Lua 的一种方便的方法,但 Lua 无法查看其内容。 Userdata 只有在你将其传递回 C++ 并且有一种确定其类型的方式时才有用(实际上是将其转换为正确的类型)。

Lua 表格是最接近 C++ 中结构体的数据结构。你可以编写类似这样的代码:

lua_newtable(state);
lua_pushnumber(state, s->a);
lua_setfield(state, -2, "a");
lua_pushnumber(state, s->b);
lua_setfield(state, -2, "b");

这样,在 Lua 中就可以引用它了:

print(foo.a); -- 现在将打印 11
2013-03-14 01:40:48
用户551514
用户551514

已解决: 我使用了 luajit 并且能够在 lua 端传递一个缓冲区并将其转换为 C 结构体。

2013-03-20 18:42:47