Lua 栈的理解
来源:互联网 发布:怎样在淘宝网上注册 编辑:程序博客网 时间:2024/06/08 07:55
提到C++与lua互调,不可不提栈。
栈是C++和Lua相互通讯的一个地方。
首先这个栈并不是传统意义上的栈(传统的栈需要放同一种数据类型,但在网上的某些资料说,每个栈元素是一个联合体)。
栈从上向下分别是-1,-2,-3... ; 从下向上分别是1,2,3...
这也就是lua_gettop为什么可以获得栈中总元素数的原因。因为lua_gettop()获得的是从下向上栈顶的索引,因为从1开始,栈顶的索引也即是总元素数。
1.
lua_getglobal(L,“lua变量名");
这个函数会将lua中的某变量放置到栈顶,于是C++就可以取了。
2.
lua_tointeger(L, "某索引")
将某索引的栈中元素取得(并不出栈),索引可为正或者负。
同系列的还有lua_toboolean,lua_tostring等。
3.
lua_call(L,参数个数,返回值个数)
在调用之前,要将函数名,各个参数,分别入栈。
4.
lua_register
将某C函数注册(建立与lua函数的关联关系 )
可以想象内部有一个map<string(lua函数名) ,C函数指针>
要注意 函数的返回值要是int ,参数要是lua_State*
查看lua_CFunction的定义,就明白为什么了。
5.打印整个栈
这个是很重要的一个技巧,尤其在初学阶段。
我就曾经被网上一段错误代码弄的百思不得其解,后来通过打印栈的方式,明白他写的是错的。
而且通过打印栈我还发现,调用luaopen_base(L)系列函数时,每调用一个,会在栈中push一个table
这也就是为什么说lua所有变量,函数(函数其实也是变量),
都在lua_State中的原因。
//该函数来自网络void stackDump(lua_State* L){ int i; int top = lua_gettop(L); printf("stackDump(num=%d):\n",top); for (i = 1; i <= top; i++) { /* repeat for each level */ int t = lua_type(L, i); switch (t) { case LUA_TSTRING: /* strings */ printf("`%s'", lua_tostring(L, i)); break; case LUA_TBOOLEAN: /* booleans */ printf(lua_toboolean(L, i) ? "true" : "false"); break; case LUA_TNUMBER: /* numbers */ printf("%g", lua_tonumber(L, i)); break; default: /* other values */ printf("%s", lua_typename(L, t)); break; } printf(" "); /* put a separator */ } printf("\n"); /* end the listing */ }
0 0
- Lua 栈的理解
- 理解Lua的Coroutine
- 理解LUA栈
- [Lua源码阅读] 理解Lua的object
- lua元表的理解
- Lua闭包的理解
- lua内存释放的理解
- 理解lua的闭包
- Cocos2d-lua的运行理解
- Rspamd_rule_Html.lua自己的理解
- Rspamd_rule_Forwarding.lua自己的理解
- Rspamd_rule_subject_checks.lua自己的理解
- Rspamd_rule_compromised_hosts.lua自己的理解
- 深入理解Lua与C数据通信的栈
- 深入理解Lua与C数据通信的栈
- 深入理解关于Lua与C数据通信的栈
- lua栈理解及lua和C++的数据交换API介绍
- lua栈理解及lua和C++的数据交换API介绍
- cocos2d-x 将cocosbuilder输出文件映射成对象的原理
- C++类的内存分配
- spring 4.1.5 到 4.3.5中defaultContentType 报错的解决
- Lua与C++互相调用(上)
- 从京东退货体验吐槽客服流程
- Lua 栈的理解
- cocoapods 安装使用指南
- quick cocos2d-x 入门---井字棋
- 实战caffe多标签分类——汽车品牌与车辆外观(C++接口)[详细实现+数据集]
- LBF特征
- 读Lua游戏开发实践指南
- 将博客搬至CSDN
- gevent管理socket时容易忽略的错误
- 树莓派(Raspberry)更换Kail linux源