Lua与C++交互总结

工作中遇到了Lua与C++交互的需求,发现有很多之前遗漏的知识点,现一一补上。

由于是下班时间写的,代码例子没有贴,有时间再加上

目录

1、lua的虚拟栈下标含义

2、lua_settable、lua_gettable解析

2.1 void lua_settable (lua_State *L, int index);

2.2 void lua_gettable (lua_State *L, int index);

3 lua_setfield、lua_getfield解析

3.1 void lua_setfield(lua_State *L, int index, string key)

3.2 lua_getfield 待补

4 lua_pcall(lua_State *L,int nargs,int nresults,int errfunc)

5、lua_rawgeti、lua_rawseti

lua_rawgeti

lua_rawseti

6 lua返回table值

7、C++与Lua传递userdata参数

lua返回userdata:

lua_pushlightuserdata


1、lua的虚拟栈下标含义

Lua实现了一个虚拟栈,和C交换数据都通过这个虚拟栈进行。访问这个虚拟栈也是用下标。整数1, 2, 3, 4表示从栈底数起,负数-1,-2,-3,-4表示从栈顶数起

2、lua_settable、lua_gettable解析

2.1 void lua_settable (lua_State *L, int index);

作一个等价于 t[k] = v 的操作, 这里 t 是一个给定有效索引 index 处的值, v 指栈顶的值, 而 k 是栈顶之下的那个值。这个函数会把键和值都从堆栈中弹出。

2.2 void lua_gettable (lua_State *L, int index);

将栈顶作为key,获取索引index的table里的值.

一般使用前要将key放入到虚拟栈顶部去。搭配lua_pushstring、lua_pushnumber等去使用

3 lua_setfield、lua_getfield解析

3.1 void lua_setfield(lua_State *L, int index, string key)

作一个等价于 t[k] = v 的操作, 这里 t 是一个给定有效索引 index 处的值, v 指栈顶的值, 而 k 是则是参数 key

等价于

lua_pushstring(L, "key");
lua_pushstring(L, "value");
Llua_settable(L, -2)

3.2 lua_getfield 待补

void lua_getfield(lua_State *L, int index, string key)

获取t[key]值,t是虚拟栈中索引为index的table,名为t

4 lua_pcall(lua_State *L,int nargs,int nresults,int errfunc)

nargs 参数个数
nresults 返回值个数
errFunc 错误处理函数,0表示无,表示错误处理函数在栈中的索引

 使用lua_pcall后,如果有返回值,则会将返回值保存至栈顶处

5、lua_rawgeti、lua_rawseti

lua_rawgeti

* 从table中得到相应下标的元素
void lua_rawgeti(lua_State *L, int index, int key)
index表示table在栈中的位置
key表示元素在table中的位置

结果会保存到栈顶

lua_rawseti


*把值放到table相应下标位置
void lua_rawseti(lua_State *L, int index, int key)
index表示table在栈中的位置
key表示元素在table中的位置

lua_rawgeti 和 lua_getfield 的区别

想必通过两者的参数也知道区别了。lua_getfield是字符串key,lua_rawgeti是数值键

6 lua返回table值

当c++调用lua函数返回值为table时该怎么遍历呢?

参考博客:        Lua学习笔记1_Isaf的博客-CSDN博客

lua_pushnill(L);
while(lua_next(L, -2))
{
    //这时值在-1(栈顶)处,key在-2处。
    lua_pop(L, 1);//把栈顶的值移出栈,让key成为栈顶以便继续遍历
}

这里重点说明一下lua_next。它执行操作是这样的,先判断上一个key的值(这个值放在栈顶,如果是nil,则表示当前取出的是table中第一个元素的值),然后算出当前的key,这时先把栈顶出栈,将新key进栈,最后将新key对应的值进栈。这样栈顶就是table中第一个遍历到的元素的值。用完这个值后,我们要把这个值出栈,让key在栈顶以便继续遍历。当根据上一个key值算不出下一个key值时,lua_next返回0,结束循环
 

7、C++与Lua传递userdata参数

lua返回userdata:

https://www.javaroad.cn/questions/325604


c传递userdata到lua  

lua_pushlightuserdata

void lua_pushlightuserdata (lua_State *L, void *p)

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/124135843