Lua学习笔记:C++操作Lua的表

news2024/11/28 17:40:46
前言
本篇在讲什么

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_rawgetilua_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_setfieldlua_rawseti方法来修改表内的值,修改后调用dump方法,输出内容变成修改后的值,如下图2

在这里插入图片描述
在这里插入图片描述

我们简单再分析一下内容

lua_setfield(L, -2, "name");

lua_rawseti(L, -2, 6);

方法lua_setfieldlua_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

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

23种设计模式之策略模式(Strategy Pattern)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的策略模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬不…

构建Transformer模型 | 在wikiText-2数据集上训练一个语言模型

0 Introduction CSDN上有很多关于Transformer模型代码及解析的教程,但总体感觉还是不够直观,本文来自以B站上一个公开课,讲得非常详细,建议花一点时间从头到尾跟做一遍,单纯看静态的代码和文字描述,还是比…

十大排序(四)

上几篇文章我们说的是比较类的排序,今天给大家分享一下非比较累的排序;非比较类中包含桶排序 :基数排序、桶排序、计数排序 计数排序 找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数,存入…

Azure Active Directory 的功能和优势

Azure Active Directory (Azure AD) 是 Microsoft 基于云的多租户目录和标识管理服务。 Azure AD 有助于支持用户访问资源和应用程序,例如: 位于企业网络上的内部资源和应用。 Microsoft 365、Azure 门户和 SaaS 应用程序等外部资源。 为组织开发的云应…

详解uni-app应用生命周期函数

详解uni-app应用生命周期函数 详解uni-app应用生命周期函数 文章目录 详解uni-app应用生命周期函数前言一、应用生命周期函数二、页面生命周期函数总结 前言 UNI-APP学习系列之详解uni-app应用生命周期函数 一、应用生命周期函数 函数名说明onLaunch当uni-app 初始化完成时触…

web自动化测试流程的总结及关注点

目录 一、立项后测试需要拿到的文档 二、需求评审 三、用例编写(同时根据开发计划编写测试计划) 四、用例评审 五、测试执行 六、测试报告及操作手册 项目的测试流程大只包含的几个阶段:立项、需求评审、用例评审、测试执行、测试报告文…

【PXIE301-204】基于PXIE 总线的4 路Cameralink Base 图像采集卡

产品概述: PXIE301‐204 一款基于3U PXI Express 总线的高性能4 路CameraLink Base 图像采集卡,该板卡采用Xilinx 的高性能Kintex‐7 系列FPGA 作为主控制器,实现PCI Express 总线接口的转换,图像数据的缓存,以及Camer…

MySQL表数据的CRUD操作

文章目录 一、CRUD二、Create1.插入基本语法2.单行数据全列插入3.多行数据指定列插入4.插入时如果冲突则更新旧值5.插入时如果冲突则替换 三、Retrieve1.查找基本语法2.全列查询2.指定列查询3.查询字段为表达式4.为查询结果指定别名5.查询结果去重6.where条件7.结果排序8.将查找…

石头剪刀步微信小程序游戏

石头剪刀步微信小程序游戏 一、概述二、选题内容三、效果四、前端源码五、后端源码 一、概述 之前接了学弟的一个课程作业,但是因为某些原因,最终换成了一个新的爬虫项目。 这个作业就是一个石头剪刀步的微信小游戏。就是与系统随机的单机PK&#xff0…

【手撕Spring源码】容器与Bean

文章目录 容器接口容器实现BeanFactory容器实现ApplicationContext容器实现 Bean的生命周期模板方法设计模式Bean后处理器BeanFactory 后处理器有关后处理器(PostProcessor)的调用时期Aware 接口 和 InitializingBean 接口初始化和销毁Scope 容器接口 此节我们要: 了…

人机交互学习-1 人机交互概述

人机交互概述 背景知识人机交互研究的内容人机交互的重要性用户体验用户体验的特性最佳用户体验 人机交互的发展历史人机交互与软件工程人机交互与软件工程的学科差异人机交互与软件工程的不同观点软件工程在交互式系统的缺陷人机交互对软件工程的处理人机交互与软件工程的融合…

2023年春秋杯网络安全联赛春季赛Reverse题目复现

文章目录 一.sum1. 分析程序逻辑2.解数独矩阵3.解题脚本 二.Poisoned_tea_CHELL1. 重新识别函数及程序逻辑分析2.IDA动态调试(attach附加调试)3. 输入选项进行单步调试4.解题脚本 一.sum 1. 分析程序逻辑 这里直接贴上当时分析的结果,根据程序行为不难猜出是数独问题(还得靠猜…

六轴机械臂正逆解计算

一、机械臂运动学 机械臂运动学就是根据未端执行器与所选参考坐标系之间的几何关系,确定末端执行器的空间位置和姿态与各关节变量之间的数学关系。包括正运动学 (Forward Kinematics)和逆运动学 (InverseKinematics)两部分。 正运动学就是根据给定的机器人的各个关…

关于Vuex中使用mapGetters的应用以及项目实例演示以及gettes从接口获取内容更新

哈喽,小伙伴们大家好啊 今天在项目中看到了Vuex,以及看到了mapGettes的使用 1.首先第一步 在src->store->index.js文件中 import Vue from vue import Vuex from vuex import getters from ./gettersVue.use(Vuex) 2.然后第二步骤 在getters文…

[java]关于会话Session

前言: 客户端向服务端发请求,登陆完之后,进入到首页,如何让客户端知道它有没有登陆过呢,需要从首页里面向服务器发出异步请求,请求当前登录的用户信息,登录过就能获取得到,没登陆过获取不到。 …

Socket安全(二)

文章目录 1. 客户端模式2. 创建安全服务器Socket3. 配置SSLServerSocket 1. 客户端模式 大多数安全通信中,服务器需要使用适当的证书认证自己。不过客户端不需要(淘宝需要向用户证明它确实是淘宝,但我不需要向淘宝证明我自己的身份&#xff…

Skywalking9.4.0部署监控项目

1、SkyWalking简介 SkyWalking是国内开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前使用厂商最多,版本更新较快,已成为 Apache 基金会顶级项目。 它有哪些功能呢…

WebGPU你让我等的好辛苦啊

什么是WebGPU WebGPU是一种新兴的Web标准,旨在为Web应用程序提供高性能的图形和计算功能。它是一种低级别的图形API,为开发人员提供了对现代GPU的直接访问,以实现更高效的图形渲染和通用计算。 WebGPU的设计目标是提供与现代图形API&#x…

文心一言 VS 讯飞星火 VS chatgpt (26)-- 算法导论5.1 1题

一、证明:假设在过程 HIRE-ASSISTANT 的第 4 行中,我们总能决定哪一个应聘者最佳。则意味着我们知道应聘者排名的全部次序。 文心一言: 证明: 假设在过程 HIRE-ASSISTANT 的第 4 行中,我们总能决定哪一个应聘者最佳。则意味着我们知道应聘…

png图片压缩后黑底问题解决

问题背景 使用thumbnail对图片进行压缩,偶然会发现对png图片出现黑底的情况如下: 压缩前 压缩后 问题解决 对网上搜到的解决方法主要有两种: 1.指定png输出 JAVA - Get black background when uploading PNG image - Stack Overflow 一…