【木头Cocos2d-x 029】Lua篇(第04章):来点高难度的,获取Lua表结构数据

只是获取一个全局变量什么的太没意思了,今天我们来玩个高难度的——获取Lua表结构的数据。

(旁白:O O!我是不是该说点什么?)

上一章传送门:http://blog.csdn.net/musicvs/article/details/8445027

笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址:http://blog.csdn.net/musicvs/article/details/8445079

正文:

1. 什么是table

table是Lua里最强大的数据类型,我们可以当成是数组,但是它又和数组有点不一样,建议大家看看Lua的语法教程,因为我对table也没有熟悉到可以给大家解释的程度。

(旁白:那你还写什么教程。。。)

2. 获取table变量

现在,我们给helloLua.lua文件添加一个table全局变量:

-- helloLua.lua文件
myName = "beauty girl"helloTable = {name = "mutou", IQ = 125}

我们看到,多了一个helloTable的变量,它和数组十分相似,又和HashMap有点类似,总之它很强大。

(旁白:我觉得亮点是,你的IQ有125?我觉得乘以2的话,还有点可能~!)

话说,125乘以2等于多少?...250 ....O O!

获取helloTable变量的方式和以前是一样的:

/* 取得table变量,在栈顶 */lua_getglobal(pL, "helloTable");

这样,helloTable变量就被存放到栈顶。

可我们并不是要取table变量,因为C++中是无法识别Lua的table类型的,所以我们要取得table中具体的值,也就是name和IQ的值。

3. lua_gettable函数

有一个和lua_getglobal类似的函数,叫做lua_gettable,顾名思义,它是用来取得table相关的数据的。

(旁白:废话少点好吧= =)

lua_gettable函数会从栈顶取得一个值,然后根据这个值去table中寻找对应的值,最后把找到的值放到栈顶。

lua_pushstring()函数可以把C++中的字符串存放到Lua的栈里;

然后再用lua_gettable()取执行前面所说的步骤,lua_gettable的第二个参数是指定的table变量在栈中的索引。

(旁白:小笨木,我被你绕晕了。。。)

为了照顾旁白这个笨蛋,我们画个图来理解:

这是初始状态,堆栈里还没有任何东西,那么,现在要先把helloTable变量放到栈顶:

/* 取得table变量,在栈顶 */lua_getglobal(pL, "helloTable");

然后就变成了这样:

接着,我们要取得table的name对应的值,那么,先要做的就是把”name”字符串入栈:

/* 将C++的字符串放到Lua的栈中,此时,栈顶变为“name”, helloTable对象变为栈底 */lua_pushstring(pL, "name");

然后变成这样:

(旁白:不带这样啊,你偷偷加上了栈的索引~!)

注意了,我把栈的索引也加上了,因为我们即将要使用,这次我们用负数索引(不了解负数的索引的朋友请阅读第03章的教程哈~)。

由于”name”的入栈,现在helloTable变量已经不在栈顶了。

接着,我们调用要做最重要的一步了,取得name在table中对应的值:

/* 从table对象寻找“name”对应的值(table对象现在在索引为-2的栈中,也就是当前的栈底),取得对应值之后,将值放回栈顶*/lua_gettable(pL, -2);

此时,栈变成这样:

(旁白:发生什么事?为什么“mutou”突然出现在栈顶?!为毛!是你自己画上去的吧!)

lua_gettable倒底做了什么事情?

首先,我们来解释一下lua_gettable的第二个参数,-2是什么意思,-2就是刚刚helloTable变量在栈中的索引。

然后,Lua会去取得栈顶的值(之前的栈顶是”name”),然后拿着这个值去helloTable变量中寻找对应的值,当然就找到”mutou”了。

最后,Lua会把找到的值入栈,于是”mutou”就到了栈顶了。

(旁白:你妹纸的。。。没事,我就骂骂人)

最后我们只需要取出栈顶的数据就可以了,完整代码如下:

/* 初始化 */lua_State* pL = lua_open();luaopen_base(pL);/* 执行脚本 */luaL_dofile(pL, "helloLua.lua");/* 取得table变量,在栈顶 */lua_getglobal(pL, "helloTable");/* 将C++的字符串放到Lua的栈中,此时,栈顶变为“name”, helloTable对象变为栈底 */lua_pushstring(pL, "name");/* 从table对象寻找“name”对应的值(table对象现在在索引为-2的栈中,也就是当前的栈底),取得对应值之后,将值放回栈顶*/lua_gettable(pL, -2);/* 现在表的name对应的值已经在栈顶了,直接取出即可 */const char* sName = lua_tostring(pL, -1);CCLOG("name = %s", sName);

好了,本章到此结束。

.

【木头Cocos2d-x 029】Lua篇(第04章):来点高难度的,获取Lua表结构数据相关推荐

  1. CE修改Eternium永恒之金【LUA篇】

    CE修改Eternium永恒之金[LUA篇] 目录 CE修改Eternium永恒之金[LUA篇] 一.加密分析 二.使用LUA直接修改数据 1. 找到加密数值的地址 2. 使用CE运行LUA脚本 3. ...

  2. 【木头Cocos2d-x 026】Lua篇(第01章):让Lua和C++牵手

    [木头Cocos2d-x 026]Lua篇(第01章):让Lua和C++牵手 网上关于Lua的教程似乎还没有泛滥,最近刚好学习在Cocos2d-x使用Lua,当然了,我是写教程狂,我会分享我的学习心得 ...

  3. 【木头Cocos2d-x 028】Lua篇(第03章):简单解析Lua的堆栈

    [木头Cocos2d-x]Lua篇(第03章):简单解析Lua的堆栈 上一章传送门:http://blog.csdn.net/musicvs/article/details/8440919 经过上一章 ...

  4. 【OpenCV 例程200篇】04. 用 matplotlib 显示图像(plt.imshow)

    [OpenCV 例程200篇]04. 用 matplotlib 显示图像(plt.imshow) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV ...

  5. 微星GS66安装Ubuntu16.04并配置网卡驱动(此方法不能解决显卡和网卡同时安装的问题,如果想两者兼得请移步到另一篇ubuntu18.04的安装博客)

    微星GS66安装Ubuntu16.04并配置网卡驱动(此方法不能解决显卡和网卡同时安装的问题,如果想两者兼得请移步到另一篇ubuntu18.04的安装博客) 前言 有线.无线网卡驱动解决 前言 最近新 ...

  6. 高数篇:04拉格朗日中值定理

    高数篇:04拉格朗日中值定理 高数篇:04拉格朗日中值定理 定理7:拉格朗日中值定理 拉格朗日与罗尔定理的区别 拉格朗日的应用1.0 多次使用拉氏2.0 转载需注明出处 高数篇:04拉格朗日中值定理 ...

  7. 【游戏客户端面试题干货】--2021年最新游戏客户端面试干货(lua篇)

      [游戏客户端面试题干货]-- 2021年度最新游戏客户端面试干货(lua篇)     大家好,我是Lampard~~   经过春招一番艰苦奋战之后,我终于是进入了心仪的公司.   今天给大家分享一 ...

  8. 【游戏客户端与服务器面试题】-- 2022年最新游戏客户端与服务器面试(lua篇持续更新)

    [游戏客户端与服务器面试题干货]-- 2022年度最新游戏客户端面试干货(lua篇) 文章目录 一.Lua的8种数据类型 (1) nil 类型 (2) boolean类型 (3) number类型 1 ...

  9. SDN入门第一篇——Ubuntu16.04安装mininet-wifi

    SDN入门第一篇--Ubuntu16.04安装mininet-wifi 最近因为项目需要,需要使用mininet搭建SDN仿真平台,mininet-wifi除了包含基本的mininet功能之外还包括引 ...

最新文章

  1. 三、单链表增删改查原理和代码实现
  2. 线程安全的map_ThreadLocal | 线程本地存储
  3. 手动实现Spring中的IOC容器
  4. 致敬HarmonyOS不平凡的2020,热情背后还有多少期待
  5. 墨者学院 - 零基础学习手工SQL注入
  6. 小米8 青春版root时无法检测到手机
  7. 系统之家xp服务器系统怎么安装,系统之家教你如何用u盘装xp系统
  8. (014) 类函数和对象函数
  9. 用html语言设计李白的一首诗,李白《赠汪伦》的教案设计
  10. SAP BASIS ADM100 中文版 Unit 7(1)
  11. @ select 函数使用说明
  12. nofollow标签使用方法
  13. 迪赛智慧数——柱状图(基本柱状图):1994-2022年历届世界杯投入资金
  14. 有隔板高效过滤器和无隔板高效过滤器区别在哪里
  15. 网络工程师成长日记424-造假的人
  16. R语言使用pdf函数将可视化图像结果保存到pdf文件中、使用pdf函数打开图像设备、使用dev.off函数关闭图像设备、自定义width参数和height参数指定图像的宽度和高度
  17. Loadrunner各种类型脚本实例
  18. 开机自启动程序脚本(部署)
  19. three.js 模型详解和外部模型详解
  20. termux文件导入导出

热门文章

  1. 根据真实数据计算一段时间内价格走势,echarts折线图数据补全方法。
  2. 把废弃的Kindle改装成自己的Linux开发平台
  3. 蓝桥杯真题:字串排序
  4. 小小算法,可笑可笑——摩尔投票法(集万家之长)
  5. 为产业AI去障:联想的边缘突破
  6. 成都待慕电商:抖音虚假宣传虚构被比较价格违规细则
  7. innerText 和 innerHTML区别
  8. Maven,将本地jar包安装到Maven厂库
  9. 新鲜的免杀工具 GoBP
  10. 【甘道夫】HBase随机宕机事件处理 JVM GC回顾