c++和Lua交互

ops/2024/10/18 18:16:03/

lua vm

Lua VM(虚拟机)是指运行Lua脚本的执行环境。Lua VM负责将Lua脚本编译成中间代码,然后将该中间代码解释执行或者编译成本地代码执行。在虚拟机之外,Lua的脚本代码并不能直接被计算机指令执行。因此,必须有想办法将其翻译为虚拟机能够解释和执行的代码。

Lua VM在实现上使用了栈(stack)这一数据结构来存储Lua程序执行时的状态。所有Lua代码都会在虚拟机上进行模拟执行,而每个Lua函数都会被编译成虚拟机执行的代码,所以在Lua中无论是何种函数,都可以被视为一个可被调用的虚拟机程序。

Lua VM的设计非常灵活,可以通过CAPI(Lua与C语言之间的接口)与C++代码互操作。在C该程序调用Lua脚本时,可以将Lua代码文件编译并加载到在C++程序中初始化的Lua VM实例中,使整个程序在VM中被运行。而在Lua VM中调用C++函数时,C++函数需要通过CAPI函数注册到Lua环境中,然后Lua程序才可以在运行期间调用这些函数。

lua vm状态指针

在Lua中,我们通过一个名为lua_State的数据结构来管理Lua的虚拟机状态。这个结构体实际上就是Lua的虚拟机,它保存了代码控制块、运行时栈、全局环境表格等信息,以及用于执行Lua程序的函数、方法和操作符等。每个虚拟机只能执行一个Lua程序。

在C++中,我们可以使用指向lua_State类型的指针变量来访问和管理Lua的虚拟机状态。当我们需要使用Lua VM时,我们需要通过Lua提供的函数(如lua_open()luaL_newstate())创建一个新的Lua VM实例,这样可以获取到一个指向lua_State类型的指针,后续我们可以通过这个指针来操作虚拟机。

c++和lua数据交互的数据结构

在使用Lua进行交互时,Lua会使用一个LIFO(后入先出)的堆栈作为数据传输的通道。这个堆栈位于Lua的虚拟机中,提供了一种简洁而灵活的接口,使C++程序可以方便地读取和修改Lua中的数据。

当我们在通过C++代码来访问Lua中的变量或函数时,我们需要将这些数据从Lua虚拟机从堆栈中“弹出”,并将其转换为C++中相应的类型。同样地,当我们将C++中的数据传递给Lua时,我们需要将这些数据压入Lua虚拟机堆栈中。

当我们通过C++代码遍历Lua中的一个表格(table)时,我们需要从堆栈中获取该表格,然后使用Lua提供的函数(如lua_rawgeti())依次获取每个元素的值,并将其转换为C++中的相应类型。

因此,在Lua和C++之间传递数据时,使用堆栈来传输数据是非常普遍的做法。堆栈使我们能够快速、简单地传递数据,并简化了Lua编程的过程。

v-rep中的一段代码:

bool getIntsFromTable(luaWrap_lua_State* L, int tablePos, size_t intCount, int* arrayField) {for (size_t i = 0; i < intCount; i++) {luaWrap_lua_rawgeti(L, tablePos, int(i + 1));if (!luaWrap_lua_isnumber(L, -1)) {luaWrap_lua_pop(L, 1);  // we pop one element from the stack;return (false);         // Not a number!!}arrayField[i] = luaToInt(L, -1);luaWrap_lua_pop(L, 1);  // we pop one element from the stack;}return (true);
}

函数`luaWrap_lua_rawgeti()`获取表格中特定位置上的值。具体来说,它将表格压入堆栈中,并将表格位置和所需索引作为参数,然后从栈中的表格中取回在特定索引处的值。

以下是`luaWrap_lua_rawgeti()`的详细用法:

void luaWrap_lua_rawgeti(lua_State* L, int tableIndex, int itemIndex);

该函数有三个参数:

- `L`:Lua VM的状态指针

- `tableIndex`:要取回其值的表格的栈位置

- `itemIndex`:要在表格中取回的条目的索引

luaToInt()是一个自定义函数,用于将Lua中的值转换为整数类型。而arrayField则是一个C++中的整型数组,用于存储转换后的整数值。-1表示从Lua栈顶位置开始读取值


http://www.ppmy.cn/ops/44276.html

相关文章

前端面试问题:子组件的某一个方法调用执行逻辑由父组件的属性状态变化来决定

面试官&#xff1a;请你讲讲你在该项目中遇到的问题是什么&#xff1f;你怎么解决这个问题&#xff1f; 答&#xff1a;我的回答&#xff1a;该项目的实现过程中我确实遇到了问题&#xff1a;【我会给大家整理回答思路和角度&#xff0c;那那么遇到这样的问题也可借鉴这种思路…

使用selenium打开浏览器之后,有浏览器内部的提示设置默认浏览器等,怎么屏蔽或关闭这些提示

当使用Selenium打开浏览器时&#xff0c;可能会遇到浏览器内部的一些提示或弹窗&#xff0c;例如设置默认浏览器的提示。你可以通过配置选项或设置浏览器参数来屏蔽或关闭这些提示。 以下是针对不同浏览器的一些方法&#xff1a; 对于Chrome浏览器&#xff1a; 在创建Chrome…

基于springboot实现周边游平台个人管理系统项目【项目源码+论文说明】

基于springboot实现周边游平台个人管理系统演示 摘要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以…

git二次上传文件夹、文件

主要记录自己遇到的问题。 一、报错error:failed to push somes ref to..... 报错&#xff1a;error the following untracked working tree files would be overwritten bt merge... 把报错的&#xff08;重复的文件删除&#xff09; git init git add -f 文件夹/文件名…

qt c++ can通信实现的上位机界面,附源码

qt c can通信实现的上位机界面&#xff0c;附源码

听说部门来了个00后测试开发,一顿操作给我整麻了

公司新来了个同事&#xff0c;听说大学是学的广告专业&#xff0c;因为喜欢IT行业就找了个培训班&#xff0c;后来在一家小公司实习半年&#xff0c;现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍&#xff0c;服务器缩减一半&#xff0c;性能反而提升4倍&#xff01…

【调试笔记(目录)】

调试笔记-系列文章目录 第一章 Windows 环境 [1001] 使用VS2019编译edk2&#xff08;上&#xff09; [1002] 使用VS2019编译edk2&#xff08;下&#xff09; [1003] 调试 ExdiGdbSvr [1004] WSL 修改已安装发行版名称 [1005] 配置 QEMU/x86_64 运行 OpenWrt-23.05 发行版并搭…

Ubuntu22.04之解决:忘记登录密码(二百三十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…