3

我遵循了这个样板示例: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 都匹配(0x80a708),我可以投吗?

4

3 回答 3

5

Lua 没有结构,它有表。

Userdata 是一种将不透明数据传递给 Lua 的便捷方式,但 Lua 无法看到内部数据。用户数据只有在你将它传递回 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); -- this will now print 11
于 2013-03-14T01:40:48.933 回答
2

用户数据内部无法从 Lua 代码访问。
使用表将结构从 C 传递到 Lua。
或者通过 metatable 为您的用户数据手动定义索引。

于 2013-03-13T21:09:50.857 回答
0

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

于 2013-03-20T18:42:47.413 回答