lua堆栈

2023-10-31

首先了解下c++与lua之间的通信:
假设在一个lua文件中有如下定义
-- hello.lua 文件
myName = "beauty girl"

请注意红色数字,代表通信顺序:

1) C++想获取LuamyName字符串的值,所以它把myName放到Lua堆栈(栈顶),以便Lua能看到

2) Lua从堆栈(栈顶)中获取myName,此时栈顶再次变为空

3) Lua拿着这个myNameLua全局表查找myName对应的字符串

4) 全局表返回一个字符串”beauty girl”

5) Lua把取得的“beauty girl”字符串放到堆栈(栈顶)

6) C++可以从Lua堆栈中取得“beauty girl


若有9个元素分别入栈,则:

1. 正数索引,栈底是1,然后一直到栈顶是逐渐+1,最后变成99大于1

2. 负数索引,栈底是-9,然后一直到栈顶是逐渐+1,最后变成-1-1大于-9


索引相关:

1. 正数索引,不需要知道栈的大小,我们就能知道栈底在哪,栈底的索引永远是1

2. 负数索引,不需要知道栈的大小,我们就能知道栈顶在哪,栈顶的索引永远是-1


table类型入栈情况(原文地址http://blog.csdn.net/musicvs/article/details/8445079

获取table变量

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

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


 

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

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

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

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


 

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

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

 

 lua_gettable函数

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

 

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

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

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

 

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

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

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


 

然后就变成了这样:

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

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


 

然后变成这样:

 

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

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

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

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


 

此时,栈变成这样:

 

lua_gettable倒底做了什么事情?

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

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

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


这样仍然需要不同的函数将每种C类型的值压入栈和一个从不同函数从栈上取值(并不弹出)。

使用lua_push*(lua_State * L,x)压栈,

使用lua_to*(lua_State * L,栈中位置)取值,

使用lua_pop(lua_State * L,出栈个数)出栈。

Lua_tostring函数返回一个指向字符串的内部拷贝的指针。你不能修改它(使你想起那里有一个const)。只要这个指针对应的值还在栈内,Lua会保证这个指针一直有效。当一个C函数返回后,Lua会清理他的栈,所以,有一个原则:永远不要将指向Lua字符串的指针保存到访问他们的外部函数中。


转载自:http://wind-catalpa.blog.163.com/blog/static/1147535432013119103150929/



给出Lua虚拟机的体系结构图(根据源代码分析得出):
lua architecture
首先, 我们注意到, Lua的解释器还是一个以栈为中心的结构. 在lua_State这个结构中,有许多个字段用于描述这个结构.stack用于指向绝对栈底, 而base指向了当前正在执行的函数的第一个参数, 而top指向栈顶的第一个空元素.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lua堆栈 的相关文章

  • ESP8266 NodeMCU 堆内存不足

    我正在尝试通过从我的笔记本电脑发送 POST 使用 node js 来使用 ESP8266 01 来切换 LED 我现在遇到内存问题 因为每当我发送 POST 请求时 ESP 中使用的内存就会增加 而堆内存会减少 并且当没有剩余内存时它会崩
  • 寻找 Lua 4.1 alpha

    我正在帮助为一款相当老的游戏 孤岛惊魂 开发多人模式 我想编译lua代码 但游戏使用版本4 1 alpha 我在任何地方都找不到 lua 4 1 alpha tar gz http www lua org work old lua 4 1
  • 无法在cmake中使用find_package找到Lua标头

    我正在尝试使用 CMake 为我使用 Lua 的项目构建生成 make 文件 当我运行 make 时出现此错误 path to my project luaudio luaudio c 1 17 fatal error lua h No s
  • lua检查多个值是否相等

    我喜欢用 Roblox 制作游戏 并用 lua 编写代码 在编写游戏时 我发现自己经常问一个值是否等于另一个值 这可能会产生很长的代码行 并且可能非常重复 例如 如果 x ClassName 衬衫 或x ClassName 附件 或x Cl
  • 代码说“尝试比较数字<=实例”

    It says Players ninjafox56 PlayerGui Shop ShopGui LightSide ChooseSideL 5 尝试比较数字 Rank game Players LocalPlayer leadersta
  • Lua中运算符~=是什么意思?

    什么是 Lua中的运算符是什么意思 例如 在以下代码中 if x params then the is not equals 这在其他语言中是等价的
  • Corona/Box2D 检测与非移动静态物体的碰撞

    出于发帖原因 这是我正在尝试做的事情的简单版本 在屏幕上我有一个简单的圆形对象 它是静态的并且不会移动 然后用户可以拖放一条直线 如果该线穿过该圆圈 我希望触发碰撞事件 看来除非其中一个物体正在移动 否则永远不会检测到碰撞 绘制线条时能否检
  • Lua 如何创建可用于变量的自定义函数?

    对于像 io close 这样的方法 你可以像这样使用它 file close 有没有办法创建一个像这样工作的自定义函数 您可以在变量上调用它 对我来说 我尝试使用它通过使用 string find 查找空格来将参数与文本文件分开 所以在文
  • 如何在多个Lua State(多线程)之间传递数据?

    我在中启动Redis连接池redis lua 通过从 C 调用 我得到了redis lua state 此 Lua 状态全局启动一次 仅在其他线程中启动get从中 当有一个 HTTP 请求 工作线程 时 我需要从redis lua stat
  • 十六进制常数 = 格式错误的数字?

    我有一个 Lua 脚本 我试图在其中使用十六进制数字 0x 如果我使用官方 Windows 二进制文件在控制台中运行此脚本 它可以正常工作 但是如果我在我的应用程序中运行它 简单的 dofile 我得到 malformed number n
  • Lua:冒号符号、“自我”和函数定义与调用

    我对定义 调用 Lua 函数时使用的冒号表示法感到非常困惑 我以为我已经明白了 直到我看到这段代码 function string PatternSafe str return str gsub pattern escape replace
  • Lua中如何获取目录列表

    我需要 LUA 中的目录列表 假设我的目录路径为 C Program Files 我需要该特定路径中所有文件夹的列表以及如何搜索该列表中的任何特定文件夹 Example 需要路径 C Program Files 中所有文件夹的列表 以下是上
  • lua_resume 的 from 参数的含义

    From Lua 5 2 参考手册 http www lua org manual 5 2 manual html lua resume int lua resume lua State L lua State from int nargs
  • Lua userdata:无法同时进行数组访问和方法

    我遇到了这个人的问题 Lua userdata数组访问及方法 https stackoverflow com questions 26970316 lua userdata array access and methods 其中 当我设置用
  • Lua :: 如何编写加载多个CPU的简单程序?

    我还无法用 Lua 编写一个可以加载多个 CPU 的程序 自从Lua通过协程支持这个概念 http www lua org pil 9 4 html 我相信这是可以实现的 我失败的原因可能是以下之一 这在Lua中是不可能的 我写不出来 an
  • 检查多个位置的值并仅在源唯一时返回匹配项

    假设我有一个清单Vendors 阿斯达 乐购 Spar 我有一个清单Sources 或者这个类比中的供应商 家乐氏 Kellogg 吉百利 Cadbury 雀巢 Nestle 强生 Johnsons 帮宝适 Pampers Simple 等
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • 如何通过 C API 在自己的环境中执行不受信任的 Lua 文件

    我想通过调用在其自己的环境中执行不受信任的 lua 文件lua setfenv http pgl yoyo org luai i lua setfenv这样它就不会影响我的任何代码 该函数的文档仅解释了如何调用函数 而不解释如何执行文件 目
  • 如何让我的 add 命令找到第一个变量和第二个变量的值,然后将它们加在一起?

    vars values function open file lex file end function lex file local data io open file r for char in data lines do Print

随机推荐

  • dm9000网卡,uboot代码分析

    uboot移植 九 移植网卡DM9000 一 原理 TQ210 板载的网卡芯片是 DM9000A 接在 S5PV210 的 SROM 控制器的 BANK1 上 S5PV210 的 SROM 控制器支持 8 16 位 NOR Flash PR
  • 人工智能数学基础6:极限、极限运算、ε-δ语言、ε-N语言、级数和函数连续性

    老猿Python博文目录 一 极限的定义及四则运算 极限 某一个函数中的某一个变量 此变量在变大 或者变小 的永远变化的过程中 逐渐向某一个确定的数值A不断地逼近而 永远不能够重合到A 永远不能够等于A 但是取等于A 已经足够取得高精度计算
  • framebuffer驱动详解

    裸机中如何操作LCD LCD的显示原理 DDR中分出一块内存 将要显示的内容放到显存中 硬件自动将显存数据放到驱动器中 驱动器操控LCD显示内容 裸机操作LCD的方法由LCD的本身的工作原理决定 OS下操作LCD的难点 内核 驱动 做底层硬
  • c++中数组的使用

    在c 中 有三个强而有力的工具 分别是数组 指针还有字符串 可以说 没有熟练掌握这三个工具的不能算是一个合格的程序员 1 数组 数组 实际上就是向系统申请一个连续的内存空间 每个内存空间的地址连续 并且大小相同 关于数组的声明 语法如下 类
  • Object类、String类、字符串、异常

    快捷键 再IDEA中查看JDK的源代码 ctrl 7 查看一个类的所有方法或者属性 alt 7 快捷生成toString方法 alt insert enter 一 Object类 Object类是参数的最高统一类型 1 1 Java lan
  • Unity发布抖音小游戏:SDK接入

    上篇介绍Unity小游戏发布抖音平台的开发者账号注册以及小游戏创建和申请 本篇介绍字节SDK接入Unity游戏项目中 接入参考教程 Docs 下载bgdt package包 并导入Unity项目工程 打开ByteGame菜单 弹出字节工具面
  • NumPy库的学习

    本文主要记录的是笔者在B站自学Numpy库的学习笔记 引入numpy库 import numpy as np 矩阵的创建 创建一个二行三列的矩阵 array np array 1 2 3 2 3 4 查看array的行数 形状 元素数量 p
  • 第一次发布自己的npm包

    背景 在做表单的时候 会遇到很多的表单项的验证工作 几乎很多验证都是重复的 有一个比较好的lodash库来做了这些工作 但是里面有些方法与自己的期望不符 比如 lodash isEmpty 2 true是会认为是空的 这显然与实际的业务是不
  • Jsch性能问题

    Jsch是纯Java实现的SSH开源框架 可以用来执行shell命令 实现sftp上传 其中在使用中发现在session connect时连接非常耗时 很慢 经研究 log调试发现是开启gssapi认证导致 因为本程序中只使用密码认证 所以
  • JS 页面显示图片

    HTML页面 div class mini datagrid div div div
  • 程序员失业2个月找不到工作,狂刷了5遍这份pdf终获字节跳动offer

    写在前面 1月初失业 找了近2个多月的工作了 还没找到心仪的工作 感觉心好慌 不知道该怎么办了 找不到工作的时候压力很大 有人说自信会很受打击 还有人说会很绝望 是人生的低谷 尽管很多时候我们自己知道 我不是找不到工作 只是找不到理想中的好
  • 有源光网络VS无源光网络

    有源光网络 AON Active Optical Network 有源光网络 是指信号在传输过程中 从局端设备到用户分配单元之间采用光电转换设备 有源光电器件以及光纤等有源光纤传输设备进行传输的网络 有源光器件包括光源 激光器 光接收机 光
  • 助力游戏开发者,看 Google 有哪些“上新”?

    Cloud Ace 是谷歌云全球战略合作伙伴 拥有 300 多名工程师 也是谷歌最高级别合作伙伴 多次获得 Google Cloud 合作伙伴奖 作为谷歌托管服务商 我们提供谷歌云 谷歌地图 谷歌办公套件 谷歌云认证培训服务 官网 http
  • docker: Error response from daemon: driver failed programming external connectivity on endpoint lamp

    Docker容器做端口映射报错 docker Error response from daemon driver failed programming external connectivity on endpoint lamp3 46b7
  • 【C语言精讲】——代码调试方法

    1 调试 调试 Debugging Debug 又称除错 是发现和减少计算机程序或电子仪器设备中程序 错误的一个过程 1 1 调试的基本步骤 发现程序错误的存在 以隔离 消除等方式对错误进行定位 确定错误产生的原因 提出纠正错误的解决办法
  • node.js 与 redis 与 express 和session协同工作

    var RedisStore require connect redis express var redis ip 192 168 238 135 redis port 6379 app use express session secret
  • 基于 Opencv python实现批量图片去黑边—裁剪—压缩软件

    简介 批量处理图片文件 批量提取GIF图片中的每一帧 具有范围裁剪 自动去除黑 白边 调整大小 压缩体积等功能 先看一些软件的界面 是基于Tkinter写的GUI 裁剪等功能基于Opencv 下载 我添加了处理GIF的github 原作者的
  • codeStriker(及与svn、bugzilla集成)使用过程记录 续

    下面是codeStriker与svn bugzilla集成使用的脚本 放在codestriker安装目录的bin下 usr bin perl w Create codestriker topic based on subversion co
  • linux后台开发必知的io优化知识总结

    尊重原创版权 https www hanzhangsy com hot 105435 html 更多内容参考 https www hanzhangsy com linux后台开发必知的io优化知识总结 系统学习 IO性能对于一个系统的影响是
  • lua堆栈

    首先了解下c 与lua之间的通信 假设在一个lua文件中有如下定义 hello lua 文件 myName beauty girl 请注意红色数字 代表通信顺序 1 C 想获取Lua的myName字符串的值 所以它把myName放到Lua堆