如何从C执行lua表操作?
我需要从C对Lua表执行操作,其中表被视为列表或队列。具体来说,我需要在头部插入一个元素,然后移除头部元素,并移动其他元素以容纳新元素 这在直接的lua中很简单,我会使用如何从C执行lua表操作?,c,lua,C,Lua,我需要从C对Lua表执行操作,其中表被视为列表或队列。具体来说,我需要在头部插入一个元素,然后移除头部元素,并移动其他元素以容纳新元素 这在直接的lua中很简单,我会使用table.insert和table.remove。但是在C LuaCapi中有Lua_settable之类的函数,但没有出现与之等价的table.insert和table.remove函数。看起来在名为tinsert和tremove的解释器中有内部C函数,但它们不是api的一部分 我真的需要调用一个lua函数来为我做这件事吗?
table.insert
和table.remove
。但是在C
LuaCapi中有Lua_settable之类的函数,但没有出现与之等价的table.insert
和table.remove函数。看起来在名为tinsert
和tremove
的解释器中有内部C函数,但它们不是api的一部分
我真的需要调用一个lua函数来为我做这件事吗?我相信你可以重用这些函数
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))
这些都在ltablib.c中。它们只依赖于Lua的API。代码未经测试,但这里有一个草图。传递表的索引,对于insert函数,还传递要插入的值的索引。要删除,将该值推送到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;
/* shift elements right to make room */
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); /* push first element */
/* shift elements left */
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);
}
#定义getn(L,n)(luaL_checktype(L,n,LUA_TTABLE),luaL_getn(L,n))
在头部插入无效(lua\U State*L、int tbl\U idx、int val\U idx){
INTE;
/*将元素向右移动以腾出空间*/
对于(e=getn(L,tbl_idx)+1;e>1;e--){
拉瓦盖蒂(L、tbl、idx、e-1);
卢阿乌·罗塞蒂(L,tbl_idx,e);
}
lua_pushvalue(L,val_idx);
拉瓦塞蒂(L,tbl_idx,1);
}
无效从头部移除并推动(lua\U状态*L,int tbl\U idx){
INTE;
int n=getn(L,tbl_idx);
如果(n==0)
返回luaL_错误(“从空列表的开头删除”);
lua_rawgeti(L,tbl_idx,1);/*推送第一个元素*/
/*左移元素*/
对于(e=2;e
谢谢。但是当我从代码中尝试tinsert时,它失败了,因为lua_gettop的返回值不是它期望的值。堆栈上已经有一些值,因此lua_gettop会返回类似于24的值,而函数希望它是传递的参数数,例如2或3。在调用tinsert之前,是否在堆栈中推送位置和值?是的,可以从不同的上下文调用该函数,其中堆栈上已经有了不同数量的内容。因此,我在我的tinsert版本中添加了一个额外的变量,用于堆栈偏移量,并使tinsert的内部使用该偏移量。现在它起作用了。谢谢