如何从C语言中操作Lua表?
2016-9-28 22:39:57
收藏:0
阅读:370
评论:2
我需要在C中对 Lua 表执行操作,其中这些表被视为列表或队列。具体来说,我需要在头部插入一个元素并删除头部元素,使其他元素移动以适应新元素。
在纯 Lua 中,这很简单,我会使用 table.insert
和 table.remove
。但在C中呢?
在 Lua C api 中有诸如 lua_settable 等函数,但没有公开的等价于 table.insert
和 table.remove
。看起来解释器内部有一个叫做 tinsert
和 tremove
的C函数,但它们不是 api 的一部分。
我真的必须调用执行此操作的 lua 函数吗?
原文链接 https://stackoverflow.com/questions/1044967
点赞
stackoverflow用户41661
代码未测试,但是这里有一个概要。您需要传入表的索引,对于插入函数,还需要传入要插入的值的索引。对于删除,值会被推到Lua栈上。
#define getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))
void insert_at_head (lua_State *L, int tbl_idx, int val_idx) {
int e;
/* 向右移动元素以腾出空间 */
for (e = getn(L, tbl_idx) + 1; e > 1; e--) {
lua_rawgeti(L, tbl_idx, e-1);
lua_rawseti(L, tbl_idx, e);
}
lua_pushvalue(L, val_idx);
lua_rawseti(L, tbl_idx, 1);
}
void remove_from_head_and_push (lua_State *L, int tbl_idx) {
int e;
int n = getn(L, tbl_idx);
if (n == 0)
return luaL_error("removed from head of empty list");
lua_rawgeti(L, tbl_idx, 1); /* 推送第一个元素 */
/* 向左移动元素 */
for (e = 2; e < n; e++)
lua_rawgeti(L, tbl_idx, e);
lua_rawseti(L, tbl_idx, e-1);
}
lua_pushnil(L, val_idx);
lua_rawseti(L, tbl_idx, n);
}
2009-06-25 21:22:03
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我相信您可以重用以下功能和宏,它们是在
ltablib.c
中:static int tinsert (lua_State *L) static int tremove (lua_State *L)
#define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))
它们仅依赖于 Lua 的 API。请保留原有的 markdown 格式。