本篇在讲什么 C++操作Lua的表(table) 本篇适合什么 适合初学Lua的小白 适合需要C/C++和lua结合开发的人 本篇需要什么 对Lua语法有简单认知 对C/C++语法有简单认知 依赖Lua5.1的环境 依赖VS 2017编辑器 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 |
★提高阅读体验★ 👉 ♠ 一级标题 👈👉 ♥ 二级标题 👈👉 ♣ 三级标题 👈👉 ♦ 四级标题 👈 |
目录
- ♠ 前景概要
- ♠ 读取Lua的表(table)
- ♥ lua_gettable
- ♥ lua_rawgeti和lua_getfield
- ♠ 设置Lua的表(table)
- ♥ 修改表内值
- ♥ 创建新表
- ♠ 推送
- ♠ 结语
- ♠ 推送
- ♠ 结语
♠ 前景概要
Visual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本
Lua学习笔记:C/C++和Lua的相互调用
上述两篇文章介绍了如何搭建环境、C/C++和Lua之间如何进行数据交换,如果不清楚其中原理,建议了解后再学习本篇文章
♠ 读取Lua的表(table)
想在C++内读取Lua表内的值,有多种方式,下面我们介绍几种
♥ lua_gettable
我们这里简单介绍如何在C++代码当中读取Lua的表,我们先简单写一段Lua代码,补充全局表roleInfo
写一段C++代码,重点需要用到的函数是lua_gettable
,用来获取栈中的表,运行后效果如下图2,成功获取并输出了表中的name
字段对应的值
下面我们详细说一下lua_gettable
的功能,和各个步骤都干了什么
- 第一步:获取Lua中的全局表
lua_getglobal(L, "roleInfo");
这个就是通过函数lua_getglobal
带上全局表的名字,将Lua中的表压入到栈内,执行后,栈的内容变得如上图所示,栈内只有一个表
- 第二步:将需要获取的key压入到栈内
lua_pushstring(L, "name");
函数lua_gettable
有个特性,执行的时候会从栈顶取一个值,用该值当key从表内获取数据,所以要将需要对应的key先压入到栈内,执行后栈的内容变得如上图所示,栈内两个数据,栈顶为key,栈底为表
- 第三步:调用lua_gettable
lua_gettable(L, -2);
前文我们已经说了,此时栈内两个数据,table在栈底,索引是-2,执行后根据栈顶的key获取到value,然后将值压入到栈内,结果如上图所示
♥ lua_rawgeti和lua_getfield
同样的我们先写一段Lua代码,内包含不同key值的表roleInfo
再写一段C++代码,使用我们的lua_rawgeti
和lua_getfield
函数如下图,执行输出后如下图2
- 第一步依然是将全局表现压入到栈内
lua_getglobal(L, "roleInfo");
- 第二步:直接将key对应的值压入栈
lua_getfield(L, -1, "name");
lua_rawgeti(L, -2, 6);
lua_getfield
可以直接将对应索引的表内的值压入到栈,key值必须为字符,上述代码意味着,获取索引为-1的表,然后去表中key为name的值,然后压入到栈内
lua_rawgeti
功能相同,不过key值必须为整型,上述代码意味着,获取索引为-2的表,然后去表中key为6的值,然后压入到栈内
♠ 设置Lua的表(table)
我们在前文已经学习了如何去读取Lua的表,下面我们了解一下如何去修改和创建Lua的表
♥ 修改表内值
依然第一步我们先准备Lua代码,如下图所示,本次除全局表外,多了一个方法dump
用来输出表的key和value
第二步在C++中利用利用lua_setfield
和lua_rawseti
方法来修改表内的值,修改后调用dump方法,输出内容变成修改后的值,如下图2
我们简单再分析一下内容
lua_setfield(L, -2, "name");
lua_rawseti(L, -2, 6);
方法lua_setfield
和lua_rawseti
功能相同,都是将栈内对应索引的值弹出,然后根据参数的key赋值到栈底的表内,二者区别是一个处理key为字符的情况,一个处理key为整型的情况
以上述代码为例,lua_setfield将索引为-2的值,赋值给栈底表内key为"name"的值
以上述代码为例,lua_rawseti将索引为-2的值,赋值给栈底表内key为6的值
我们再通过图例看一下
注:
赋值都是给靠近栈底的第一个表
♥ 创建新表
我们也可以通过C API去创建一个新表,我们依旧先准备一段Lua代码,包含一个名为dump
的方法,接受一个参数表,方法体内将表的key和value输出
我们在C++内通过函数lua_newtable
创建一个新表压入到栈内,然后通过我们上文学习的lua_setfield和lua_rawseti方法,向表内设置数据,最后调用方法输出,效果如下
这里重点说一下lua_newtable
方法,其作用就是创建一个空表压入栈内
也可以使用lua_createtable(lua_State *L, int narr, int nrec)方法创建,参数分配narr个array元素的空间和分配nrec个非array元素的空间
lua_newtable(L)等同于lua_createtable(L,0,0)
下面我们依然利用图例去理解这个过程
♠ 推送
- Github
https://github.com/KingSun5
♠ 结语
若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。
♠ 推送
- Github
https://github.com/KingSun5
♠ 结语
若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。