【发布时间】:2020-10-03 19:43:12
【问题描述】:
我遵循了这个样板示例: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),我可以投吗??
【问题讨论】:
-
除了赋值和相等测试外,Lua 中没有对
userdata值的预定义操作。您必须使用用户数据的元表来定义查找的工作方式。 ...另外,如果您的 C 程序不知道结构,但 Lua 知道 - 它来自哪里? -
基本上,C 程序是一个代理,它传递给 Lua [假设它是一个知道 struc 类型的客户端] 服务器发送的这个缓冲区。
-
问题是,使用任何方法,您在 C 中得到的只是字符串形式的成员名称(使用表或带有
__index元方法的用户数据)。我不知道如何仅通过将结构的名称包含在字符串中来返回结构的成员-除非您创建某种将这些字符串映射到成员/偏移量的表(或switch语句)-您将不得不明确地这样做,而你必须知道结构的成员。 -
已解决:我使用了 luajit,并且能够传递一个缓冲区并将其转换为 lua 端的 C 结构。
标签: lua