我按照这个锅炉板示例:http://www.matrix44.net/blog/?p=456
我能够将字符串从C发送到Lua,但是当我传递一个struct(我使用lua_newuserdata)时出现错误。
- C snip ---
//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); //打印0x80a708 result = lua_pcall(state,0,LUA_MULTRET,0);
--- Lua snip ---- print(foo)//打印0x80a708 io.write(“收到了:\ n”,foo.a); //错误:无法运行脚本:script.lua:1:尝试索引全局'foo'(用户数据值)
如何将缓冲区转换为struct / table-record?
最终,我的C程序不知道它只会将缓冲区传递给Lua的结构,而Lua知道结构并需要在那里进行转换。
谢谢, PS:脚本和C程序的printf匹配(0x80a708),我可以直接投射吗?
答案 0 :(得分:4)
Lua没有结构,它有表格。
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); -- this will now print 11
答案 1 :(得分:2)
Lua代码无法访问用户数据内部 使用表将结构从C传递给Lua 或者通过metatable手动为用户数据定义索引。
答案 2 :(得分:1)
已解决:我使用了luajit并且能够传递缓冲区并将其转换为lua端的C结构。