lua新手:C-lua如何从C向lua传递结构/缓冲区?

lua新手:C-lua如何从C向lua传递结构/缓冲区?,lua,Lua,我遵循以下锅炉板示例: 我能够将字符串从C发送到Lua,但当我传递一个struct(我使用了Lua_newuserdata)时,我遇到了一个错误 剪断 //s=(ST*)malloc(sizeof(ST)); //lua_pushlightuserdata(状态,s); s=lua_newuserdata(state,sizeof(ST)); s->a=11; s->b=12; printf(“s=%p\n”,s);//打印0x80a708 结果=lua_pcall(状态,0,lua_MULTR

我遵循以下锅炉板示例:

我能够将字符串从C发送到Lua,但当我传递一个struct(我使用了Lua_newuserdata)时,我遇到了一个错误

剪断
//s=(ST*)malloc(sizeof(ST));
//lua_pushlightuserdata(状态,s);
s=lua_newuserdata(state,sizeof(ST));
s->a=11;
s->b=12;
printf(“s=%p\n”,s);//打印0x80a708
结果=lua_pcall(状态,0,lua_MULTRET,0);

卢阿剪
如何将缓冲区强制转换为结构/表记录

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

谢谢,
PS:脚本和C程序的printf都匹配(0x80a708),我可以强制转换吗???

用户数据内部无法从Lua代码访问。
使用表将结构从C传递到Lua。

或者通过metatable手动定义用户数据的索引。

Lua没有结构,它有表

Userdata是将不透明数据传递给Lua的一种方便方法,但Lua无法看到内部。USER数据只有在将其传递回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

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

除了赋值和相等性测试之外,lua中的
userdata
值没有预定义的操作。您必须使用userdata的元表定义查找的工作方式。。。此外,如果您的C程序不知道结构,但Lua知道-它来自哪里?基本上,C程序是一个代理,它将服务器发送的缓冲区传递给Lua[假设它是一个知道结构类型的客户机]。问题是,无论采用何种方法,在C中只会得到作为字符串的成员名(使用表或带有
\u index
元方法的userdatum)。我不知道如何仅从字符串中返回结构的成员,除非您创建某种表(或
switch
语句)这会将这些字符串映射到成员/偏移量-您必须显式地这样做,反过来您必须知道结构的成员。已解决:我使用luajit,能够传递缓冲区并将其强制转换到lua端的C struct。我知道表。我的C程序不知道该结构,它只是一个将缓冲区传递给lua的代理,所以如何处理我是否将该缓冲区强制转换为lua结构或表?我仍在阅读索引,但不了解它。在某个时候,您需要C来了解缓冲区的结构。lua本身无法做到这一点,因为C结构只是指向指针的一组偏移量,由编译器生成。访问C结构的唯一安全方法是通过C。如果y如果在构造时没有表示形式,可以创建一个元表并将其附加到最初使用的userdata。然后,为元表实现_索引以返回适当的值。这必须在C中完成。请看一下这一点,了解如何使用元表索引值:@purpletech或者,如果您最喜欢的话如果你需要Lua来理解这个结构,你可以把它两端都当作一个Lua表。这样,你就不需要一个原生的C结构,而是有一个LuaTable类,它有像GetField(或者GetNumber,如果你不使用模板的话)这样的方法。你用什么做的?
cdata=ffi.cast(ct,init)
或者
ctype=ffi.metatype(ct,元表)
?谢谢
print(foo.a); -- this will now print 11