Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C执行lua表操作?_C_Lua - Fatal编程技术网

如何从C执行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函数来为我做这件事吗?

我需要从C对Lua表执行操作,其中表被视为列表或队列。具体来说,我需要在头部插入一个元素,然后移除头部元素,并移动其他元素以容纳新元素

这在直接的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的内部使用该偏移量。现在它起作用了。谢谢