Lua栈介绍及C++调用Lua过程分析
来源:互联网 发布:长歌门成男脸型数据 编辑:程序博客网 时间:2024/06/11 03:38
C++向Lua传递数组中描述了C++调用Lua过程。
今天在群里看到有人问下面这段代码是什么意思?
<span style="white-space:pre"></span>lua_newtable(L); lua_pushnumber(L, -1); //push -1 into stacklua_rawseti(L, -2, 0); //set array[0] by -1for(int i = 0; i < len; i++){lua_pushinteger(L, id[i]); //push lua_rawseti(L, -2, i+1); //}---------------------------------------------------------------------------------------------------------------------------------------------------------
首先从Lua栈说起。
Lua和C/C++交互使用的是Lua栈,在lua的堆栈(摘要)(http://wind-catalpa.blog.163.com/blog/static/1147535432013119103150929/)中介绍了交互过程:
请注意红色数字,代表通信顺序:
1) C++想获取Lua的myName字符串的值,所以它把myName放到Lua堆栈(栈顶),以便Lua能看到
2) Lua从堆栈(栈顶)中获取myName,此时栈顶再次变为空
3) Lua拿着这个myName去Lua全局表查找myName对应的字符串
4) 全局表返回一个字符串”beauty girl”
5) Lua把取得的“beauty girl”字符串放到堆栈(栈顶)
6) C++可以从Lua堆栈中取得“beauty girl”
若有9个元素分别入栈,则:
1. 正数索引,栈底是1,然后一直到栈顶是逐渐+1,最后变成9(9大于1)
2. 负数索引,栈底是-9,然后一直到栈顶是逐渐+1,最后变成-1(-1大于-9)
1. 正数索引,不需要知道栈的大小,我们就能知道栈底在哪,栈底的索引永远是1
2. 负数索引,不需要知道栈的大小,我们就能知道栈顶在哪,栈顶的索引永远是-1
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
下面我主要分析的是Lua栈内数据的变化。索引采用负数索引。
lua_newtable(L);索引栈内数据-1table这条语句将创建一个空table并将其压入栈。
lua_pushnumber(L, -1); //push -1 into stack索引站内数据-1-1-2table现在栈顶元素变成了-1,table变为Lua栈中第二个元素。
lua_rawseti(L, -2, 0); //set array[0] by -1将栈顶元素(-1)赋值给栈内索引-2位置的元素(table)的第0个位置,并将栈顶元素弹出。
lua_rawseti(L, index, n);即table[n] = -1;
Lua栈变为如下状态:
索引栈内数据-1table此时Lua栈中只有一个元素table。table不再是空的,它的第0个元素为-1。-----------------------------------------------------------------------------------------------------------------------------------------------------
这条语句是真正接收C++数组的部分。假设id[] = {3, 4, 2};
<span style="white-space:pre"></span>for(int i = 0; i < len; i++){lua_pushinteger(L, id[i]); //push lua_rawseti(L, -2, i+1); //}
lua_pushinterger()操作之后栈变化。索引栈内数据-13-2table同样执行lua_rawseti(L, -2, i+1); 之后
索引栈内数据-1tabletable[0] = -1; table[1] = 3;
for循环栈内变化也循环,table内容不断增加。
参考资料:
[1] http://blog.csdn.net/mm_lvw/article/details/5837403
[2] http://www.cnblogs.com/stephen-liu74/archive/2012/07/25/2470025.html
[3] http://wind-catalpa.blog.163.com/blog/static/1147535432013119103150929/
- Lua栈介绍及C++调用Lua过程分析
- [Lua]C/C++调用Lua
- [lua]C调用lua函数
- Lua编译器及Lua与C相互调用
- C/C++读取Lua中的变量及调用Lua函数
- C/C++读取Lua中的变量及调用Lua函数
- Lua 介绍及应用
- C/C++ 调用 Lua
- c调用lua脚本
- Lua调用C函数
- C调用lua
- lua 调用c函数
- lua c/c++ 调用
- Lua调用C函数
- lua调用c函数
- Lua调用C函数
- c调用lua
- c 调用 lua
- ART崛起 Android 5.0将不再支持Dalvik
- Raphael.js最基本绘制示例代码
- nginx自动切割日志访问文件脚本
- android开发之SQLite数据库 增、删、改、查
- C# Linq First 和 FirstOrDefault的区别
- Lua栈介绍及C++调用Lua过程分析
- Java中反射技术点记录
- it管理培训 IT服务管理
- Array into ranges of consecutive numbers
- NamedJdbcTemplate 使用方法
- MySQL在大型网站的应用架构演变
- 回顾老师所讲的枚举
- hibernate 对象的三种状态
- java本地调用 - JNA技术