lua与C交互关键函数
Posted 独立特行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua与C交互关键函数相关的知识,希望对你有一定的参考价值。
1、lua_next(L, t_idx)
参数解释:
L:虚拟机
t_idx:table在栈中索引
返回
int:0执行失败;非0执行成功
该函数的执行流程为:
①:先从栈顶弹出一个key;
②:从栈指定位置的table中取下一对key-value对,先将key入栈,再将value入栈;
③:如果②成功则返回非0值;否则返回0,并且不向栈中压入任何值;
说明:第②步中从table里面取出"下一对key-value"值是相对于第①步中弹出的key的,
table里面第一对key-value前面没有数据,所以先用lua_pushnil()压入一个nil值作为初始key;
到了table中已经没有key-value时,不会向栈中插入新的key-value对,这时lua_next()返回0,
循环结束;
在C里面可以使用lua_gettable()或lua_rawget()函数获取表中数据,但是你事先需知晓索引名称;
使用lua_next()的好处是,可以事先不知道这些信息;
----------------------------------------------------------------------------------------------------------
2、lua_gettable(L, t_idx)
参数解释:
L:虚拟机
t_idx:table在栈中索引
函数执行流程为:
①:取栈顶元素的值,以该值作为key,到t_idx指定的table中去取对应的value
②:弹出key,并压入取到的value
----------------------------------------------------------------------------------------------------------
3、lua_getglobal(L, key)
参数
L:虚拟机
key:宿主程序想要获取的变量的名称
返回
void
执行流程:
①:宿主会将名称key置于栈的顶部,此时栈包含一个元素;
②:lua取得这个key后,清除栈中这个key(此时栈顶不包含元素),并到lua的全局表中查找这个key对应的value
③:若全局表找到对应的value,将这个值压入栈顶(宿主程序可以取用);若全局表未找到,压入nil
----------------------------------------------------------------------------------------------------------
3、lua_setglobal(L, key)
参数
L:虚拟机
key:宿主程序想要获取的变量的名称
返回
void
执行流程:
①:宿主会将名称key置于栈的顶部
②:lua取得这个key后,作为一个全局变量名,并到lua的全局表中查找这个key对应的value
③:若全局表找到对应的value,将这个值压入栈顶(宿主程序可以取用);若全局表未找到,压入nil
----------------------------------------------------------------------------------------------------------
4、lua_settop(L, idx)
参数解释
L:虚拟机
idx:将栈指针移动到指定的索引位置,例如lua_settop(L, 0)常用来重置栈,这样我们入栈的第一个信息就在idx=1的位置了
-----------------------------------------------------------------------------------------------------------
5、lua_setfield(L, t_idx, key)
参数解释:
L:虚拟机
t_idx:表在L栈中的索引
key:待设置键名称
返回:
void
执行细节:
①:取栈顶val;
②:根据t_idx的值,找到对应的表t,做 t[key]=val的操作;
③:弹出栈顶val
------------------------------------------------------------------------------------------------------------
6、lua_getfield(L, t_idx, key)
参数解释:
L:虚拟机
t_idx:表在L栈中的索引
key:待取值的键名称
返回:
void
执行细节:
①:根据t_idx的值,找到对应的表t,取 val = t[key]
②:将val压入栈顶
------------------------------------------------------------------------------------------------------------
7、?luaL_Reg
解释:
typedef struct luaL_Reg {
? const char *name; ?// lua中函数的名称
? lua_CFunction func; ?// 指向C中函数的函数指针
} luaL_Reg;
一个数组的类型,该数组会包含一些函数,这些函数会通过?luaL_setfuncs?()函数被注册,
每一个luaL_Reg数组都必须用{NULL, NULL}来作为结尾的元素;
------------------------------------------------------------------------------------------------------------
8、?lua_createtable(L, narr, nrec)
参数解释:
L:虚拟机
narr:Table中数组部分预分配元素数量
nrec:Table中哈希部分预分配元素数量
返回:
void
执行细节:
①:创建一个table,数组部分预分配narr个元素,哈希部分预分配nrec个元素
②:将table压入栈顶
------------------------------------------------------------------------------------------------------------
9、??luaL_setfuncs(L, narr, nrec)
参数解释:
L:虚拟机
narr:Table中数组部分预分配元素数量
nrec:Table中哈希部分预分配元素数量
返回:
void
执行细节:
①:创建一个table,数组部分预分配narr个元素,哈希部分预分配nrec个元素
②:将table压入栈顶
------------------------------------------------------------------------------------------------------------
?
10、??lua_pushcclosure(lua_State *L, lua_CFunction fn, int n)
?
参数解释:
L:虚拟机
fn:c函数
n:与c函数关联的upvalues个数
返回:
void
执行细节:
①:创建和压入一个C闭包到栈顶
②:关联n个upvalues到这个C闭包,首先这些upvalue必须被压入栈中
③:该函数调用结束后会弹出上面入栈的upvalue值,闭包不会被弹出;
------------------------------------------------------------------------------------------------------------
11、??luaL_setfuncs(L, narr, nrec)
参数解释:
L:虚拟机
narr:Table中数组部分预分配元素数量
nrec:Table中哈希部分预分配元素数量
返回:
void
执行细节:
①:创建一个table,数组部分预分配narr个元素,哈希部分预分配nrec个元素
②:将table压入栈顶
------------------------------------------------------------------------------------------------------------
以上是关于lua与C交互关键函数的主要内容,如果未能解决你的问题,请参考以下文章