首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >lua菜鸟: C-Lua如何从C语言向lua传递struct/buffer?

lua菜鸟: C-Lua如何从C语言向lua传递struct/buffer?
EN

Stack Overflow用户
提问于 2013-03-14 04:43:28
回答 3查看 4.8K关注 0票数 3

我遵循了这个样板示例:http://www.matrix44.net/blog/?p=456

我可以将字符串从C语言发送到Lua,但是当我传递一个结构体(我使用了lua_newuserdata)时,我得到了一个错误。

C片段

代码语言:javascript
运行
复制
//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片段

代码语言:javascript
运行
复制
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),我可以只强制转换吗??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-21 02:42:47

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

票数 0
EN

Stack Overflow用户

发布于 2013-03-14 09:40:49

Lua没有结构,它有表。

Userdata是一种将不透明数据传递给Lua的便捷方法,但是Lua不能看到里面的内容。Userdata只有在您将其传递回C++,并且您有办法确定它是什么(本质上是将其转换为正确的类型)时才有用。

在C++中,Lua表是最接近结构的。你可以这样写:

代码语言:javascript
运行
复制
lua_newtable(state);
lua_pushnumber(state, s->a);
lua_setfield(state, -2, "a");
lua_pushnumber(state, s->b);
lua_setfield(state, -2, "b");

有了这个,现在您可以在lua中引用它:

代码语言:javascript
运行
复制
print(foo.a); -- this will now print 11
票数 5
EN

Stack Overflow用户

发布于 2013-03-14 05:09:51

用户数据内部是无法从Lua代码访问的。

使用表将struct从C传递到Lua。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15396067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档