将C语言中的结构体地址传递给Lua,在Lua中访问其内容而不复制数据
2012-12-24 7:49:34
收藏:0
阅读:154
评论:1
考虑我有一个数据包(网络数据包),它存储在 C 中的一个数组中。我有一个在 Lua 中可以处理此数据包的模块。现在我需要将该数据包传递给 Lua 进行处理。我想避免复制数据。为此,我可以使用_userdata_ 或_ lightuserdata_。但在这种情况下,基址将被推到堆栈顶部,我需要在 Lua 中编写回调或在 C 中编写元表来进行处理。
我正在面临如何开始编写 C 中的基本小回调的困难。我所需的只是假设我有如下结构:
struct abc_{
int a;
int b;
char* c;
} abc_t;
int arr1[] = {'100', '2', '4', '5', '6'};
现在我有一个包含一些数据的数组。在 C 中,我可以将该数组与此结构进行类型转换以获取特定值。
abc_t *test;
test = (abc_t *)arr1;
同样,在 Lua 中,我如何做到相同的(通过传递 arr1 的地址到栈顶,并在 C 中定义结构体)并获取变量a,b的值而不进行复制?
问题2
假设我正在使用 C 并使用 Lua 堆栈处理数组。
如果我要访问a[2],其中 a 是我的表格而 2 是索引,则 2 需要在堆栈顶部,我需要将a的位置作为第二个参数传递给 lua_gettable()。我要如何对一个_结构体_做同样的事情?我想访问结构的特定元素。如何做到这一点?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
如果您不想将C中的结构数据复制到Lua中,则需要使用专用元表将指向结构实例的指针封装到完整的_userdata_中。轻量级userdata不足以用于此类情况,因为您无法为其分配元表。
元表应定义
__index和__newindex元方法。如果Lua传递的索引为“a”、“b”或“c”,则元方法返回或分配相应的结构字段。__gc元方法可以在结构实例上调用free,__tostring元方法始终适用于调试。如果您使用题标签建议的_luabind_,该库能够为您生成元表。您也可以手动编写绑定。
回答您的第二个问题,如果您按建议定义
__index,则可以通过首先将_userdata_推送到堆栈,然后将字段名称作为字符串推送,然后使用lua_gettable访问字段。这个功能的快捷方式由函数lua_getfield提供。