我遵循了这个样板示例: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),我可以只强制转换吗??
发布于 2013-03-21 02:42:47
解决方案:我使用了luajit,并且能够传递一个缓冲区并将其转换为Lua端的C结构。
发布于 2013-03-14 09:40:49
Lua没有结构,它有表。
Userdata是一种将不透明数据传递给Lua的便捷方法,但是Lua不能看到里面的内容。Userdata只有在您将其传递回C++,并且您有办法确定它是什么(本质上是将其转换为正确的类型)时才有用。
在C++中,Lua表是最接近结构的。你可以这样写:
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-14 05:09:51
用户数据内部是无法从Lua代码访问的。
使用表将struct从C传递到Lua。
或者通过metatable手动定义用户数据的索引。
https://stackoverflow.com/questions/15396067
复制相似问题