c++和Lua交互

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.mzph.cn/pingmian/14376.shtml

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

相关文章

git分支常用命令

最近在用git提交代码的时候&#xff0c;发现有些命令不是很会&#xff0c;先记录几个常用分支命令&#xff0c;后续再补充&#xff0c;在执行git push命令提交代码的时候遇到报错&#xff0c;一并记录下。 1.git常用命令 新建分支&#xff1a; git branch <分支名称> 比…

Vue3组件通讯有哪些方式

目前最常用是props/$emit 和 vuex/pinia ,接下来是 provide/inject,其他不建议使用; 实际项目中&#xff0c;简单父子组件传递采用props/$emit &#xff0c;涉及全局共享的数据一般采用 vuex/pinia 结合存储对象localStorage/sessionStorage使用 1.props/$emit 1.props 单向数…

Python——基于共享单车使用量数据的可视化分析(1)

目录 &#x1f9fe; 1、数据集&#xff08;部分数据&#xff09; ✏️ 2、导入数据集与必要模块 1️⃣ 2.1 导入库以及字体包 2️⃣ 2.2 读取数据集 3️⃣ 2.3 查看数据集基本信息 ⌨️ 3、数据预处理 1️⃣ 3.1删除无关字段 2️⃣ 3.2对各字段进行中文标识 3️⃣ 3.3…

Open3D-Geometry-3:RGBD图像的数据处理

文章目录 0. 引言1. Redwood 数据集2. SUN 数据集3. NYU 数据集4. TUM 数据集0. 引言 Open3D 有图像的数据结构。它支持各种功能,例如read_image、write_image、filter_image和draw_geometries。 Open3D 图像可以直接与 numpy 数组相互转换。 Open3D RGBDImage由两个图像组成…

EI会议的社交活动有哪些?

EI会议&#xff08;Engineering Index会议&#xff09;不仅是一个展示最新研究成果的平台&#xff0c;也为与会者提供了丰富的社交活动机会。以下是一些常见的社交活动形式及其内容&#xff1a; 常见社交活动 1. 欢迎酒会&#xff08;Welcome Reception&#xff09; 时间和地…

图像超分辨率重建相关概念、评价指标、数据集、模型

1、图像超分辨率概念 1.1 基本定义 超分辨率&#xff08;Super-Resolution&#xff09;&#xff0c;简称超分&#xff08;SR&#xff09;。是指利用光学及其相关光学知识&#xff0c;根据已知图像信息恢复图像细节和其他数据信息的过程&#xff0c;简单来说就是增大图像的分辨…

【openpcdet中yaml文件的MODEL学习】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、代码二、详细解释MODEL: NAME: PointPillarMAP_TO_BEV (Mapping to Birds Eye View):BACKBONE_2D (2D Backbone Network): 总结 前言 提示&#xff1a;这里…

光照模型技术在AI去衣中的重要作用

引言&#xff1a; 在数字图像处理和计算机视觉领域&#xff0c;AI去衣技术正逐渐成为研究和应用的热点。这项技术依赖于人工智能算法&#xff0c;尤其是深度学习模型&#xff0c;来识别和处理图像或视频中的衣物。在这个过程中&#xff0c;光照模型技术扮演着至关重要的角色。本…

派可数据助力制造企业数字化生产管理新能力提升

生产管理是现代企业运营的核心之一&#xff0c;它决定了产品的质量、生产效率和企业的竞争力。在一个日益竞争激烈、市场需求多变的商业环境中&#xff0c;如何高效地组织和管理生产过程成为了企业不容忽视的重要课题。 过去&#xff0c;生产管理可能主要侧重于物理工厂的运作…

2024-5-6-从0到1手写配置中心Config之实现配置中心客户端

配置加载原理 在Spring中PropertySource类实现了所有属性的实例化。 启动赋值&#xff1a; 定义自定义属性配置源&#xff0c;从config-server获取全局属性&#xff1b;Spring启动时&#xff0c;插入自定义属性配置源&#xff1b;绑定属性会优先使用&#xff0c;给自定义属性…

宁盾与深信服发布联合方案,解决云桌面及微软AD完整替代

自 Citrix 退出中国市场后&#xff0c;不少中大型企业关心国产云桌面脱离微软 AD 域是否还能正常工作。在2024年3月初&#xff0c;宁盾身份目录与深信服桌面云完成兼容互认证&#xff0c;对于企业的疑问给出了官方回应。 5月10日&#xff0c;在深信服《Citrix离场背景下&#…

【设计模式】JAVA Design Patterns——Balking(止步模式)

&#x1f50d;目的 止步模式用于防止对象在不完整或不合适的状态下执行某些代码。 &#x1f50d;解释 真实世界例子 洗衣机中有一个开始按钮&#xff0c;用于启动衣物洗涤。当洗衣机处于非活动状态时&#xff0c;按钮将按预期工作&#xff0c;但是如果已经在洗涤&#xff0c;则…

类中属性赋值的过程——Java学习笔记

类中属性赋值过程 非静态属性的赋值 可以通过: 默认初始化显示初始化构造器中初始化通过对象.属性或对象.方法的方法进行赋值代码块中初始化 执行先后顺序&#xff1a;默认初始化–>显式初始化–>代码块中初始化–>构造器初始化–>通过方法进行赋值 关于字节码…

Spring中Bean的作用域有哪些?

在Spring框架中&#xff0c;Bean的作用域定义了由Spring IoC容器创建的Bean实例的可见范围和生命周期。Spring提供了几种不同的Bean作用域供我们根据需求选择使用&#xff0c;每种作用域都有其特定的用途。常用的作用域包括&#xff1a; Singleton&#xff08;单例&#xff09;…

企业签名有什么优点?

企业签名具有以下优点&#xff1a; 1.自定义企业分发&#xff1a;为企业提供更大的灵活性和控制权 2.加强企业安全性&#xff1a; 控制分发 减少潜在风险、数据泄露 3.内部应用更新和管理&#xff1a;企业可自主更新和管理内部分发。灵活发布新版本应用程序&#xff0c;修复bug…

大型语言模型(LLM)论文串烧

近期把各家大型语言模型的论文过了一遍&#xff0c;包括&#xff1a; Qwen Llama 2 BlueLM GLM-130B Baichuan2 Yi 刚好趁着刚看完还有印象稍微做下总结。

「动态规划」地下城游戏

力扣原题链接&#xff0c;点击跳转。 有一个地下城&#xff0c;我们用mn大小的二维数组dungeon表示。dungeon[i][j]如果为正&#xff0c;该位置有血包&#xff0c;可以加血量&#xff1b;如果为负&#xff0c;该位置有恶魔&#xff0c;会扣掉相应的血量。有一个骑士在左上角&a…

科技产业园3D探秘:未来科技之城的奇幻之旅

在数字时代的浪潮中&#xff0c;科技产业园区成为了推动城市经济发展、科技创新的重要引擎。 当我们打开科技产业园的3D可视化模型&#xff0c;仿佛穿越时空&#xff0c;来到了一个充满奇幻色彩的科技世界。在这里&#xff0c;高楼大厦鳞次栉比&#xff0c;绿色植被点缀其间&am…

【文末附gpt升级方案】革新多模态学习:哈工大团队推出“Uni-MoE”统一多模态大模型的跨域MoE研究

革新多模态学习&#xff1a;哈工大团队推出“Uni-MoE”统一多模态大模型的跨域MoE研究 摘要&#xff1a;随着人工智能技术的飞速发展&#xff0c;多模态学习已成为机器学习领域的重要研究方向。然而&#xff0c;传统的多模态学习方法往往存在信息融合困难、模型复杂度高等问题…

深度学习模型keras第二十三讲:在KerasCV中使用SAM进行任何图像分割

1 SAM概念 ###1.1 SAM定义 Segment Anything Model&#xff08;SAM&#xff09;是一种基于深度学习的图像分割模型&#xff0c;其主要特点包括&#xff1a; 高质量的图像分割&#xff1a;SAM可以从输入提示&#xff08;如点、框、文字等&#xff09;生成高质量的对象掩模&am…