lua与C/C++交互table(lua_gettble)

LayaNative源码编译 修改好后的LayaNative2.0需要重新编译生成Android和iOS所需要的动态库文件。 阅读详情

引用http://blog.youkuaiyun.com/yanjun_1982/article/details/7596171

今天上班的时候和程序对一个功能的程序接口,需求是这样的:脚本代码根据配置文件生成一组中奖信息,用table来保存,然后将这个table传给程序接口,程序根据这个table中的数据向玩家显示中奖界面。很简单的一个功能,脚本这边的函数很快就写完了,然后我就琢磨着程序的接口应该怎么写,由于之前没有试过在程序接口中访问lua脚本传过来的table,所以遇到了一些麻烦,上网搜了一下相关资料,总算搞清楚了。现在就简单总结一下c/c++与lua交互中关于table的一些用法吧。

有个Lua脚本函数叫OpenAwardWindow,它是c++实现的一个接口,对应的c++函数为LuaOpenAwardWindow,它的输入参数是一个table。现在我们要解决的问题是怎么在LuaOpenAwardWindow中遍历table中的所有元素。我们知道lua是通过栈来实现和c语言的交互的,至于为什么是栈呢,以后再专门说明吧。脚本传过来的table是放在栈顶的,即栈的-1位置,我们可以用lua_istable(L, -1)来检查输入参数是否合法。lua的数据类型和c的数据类型是不一样的,它们必须用专门的函数的转换,比如lua_tonumber(L, -1)就是把栈顶的数据转为double类型,lua_tostring(L, -1)是转为带结束符的字符串类型。新手一定会说,那lua_totable(L, -1)就是转换了table类型咯^_^。如果c有table这种数据类型,那一定会有这个函数的,可惜c没有。不过在这里我有个想法,能不能用c实现一种类型,它是可以和lua的table对应的呢?这样就真的可以有lua_totable这个接口了,这样c访问table就方便多了。我们还是回到如何在c中遍历table的问题中吧。在c中,它是这样访问table中的一个元素的:

//将一个key放到栈顶,这个key为1。如果你的key是字符串,那就用lua_pushstring。

lua_pushnumber(L, 1);

//table一开始是在栈顶,即-1处的,但上面的语句压入了一个值,栈顶变-2了。

//lua_gettable的作用就是以栈顶的值作为key来访问-2位置上的table。

lua_gettable(L, -2);

这时table中的第1个元素的值就放到栈顶了,你想怎么使用就怎么使用吧。

上面说的是访问table中的一个元素的方法,那要怎么样遍历table中的所有元素呢?如果table是一个以连续的整形作为key的table, 可以用下面方法:

[cpp]  view plain copy
  1. int size = lua_objlen(L,-1);//相关于#table  
  2. for(int i = 1; i <= size; i++)  
  3. {  
  4. lua_pushnumber(L, i);  
  5. lua_gettable(L, -2);  
  6. //这时table[i]的值在栈顶了  
  7. lua_pop(L, 1);//把栈顶的值移出栈,保证栈顶是table以便遍历。  
  8. };  

如果table中的key是任意值呢?可以用下面的方法:

[cpp]  view plain copy
  1. lua_pushnill(L);  
  2. while(lua_next(L, -2))  
  3. {  
  4. //这时值在-1(栈顶)处,key在-2处。  
  5. lua_pop(L, 1);//把栈顶的值移出栈,让key成为栈顶以便继续遍历  
  6. }  

这里重点说明一下lua_next。它执行操作是这样的,先判断上一个key的值(这个值放在栈顶,如果是nil,则表示当前取出的是table中第一个元素的值),然后算出当前的key,这时先把栈顶出栈,将新key进栈,最后将新key对应的值进栈。这样栈顶就是table中第一个遍历到的元素的值。用完这个值后,我们要把这个值出栈,让key在栈顶以便继续遍历。当根据上一个key值算不出下一个key值时,lua_next返回0,结束循环。

今天学习了两种遍历c代码中遍历tabl的方法,让我对lua的认识又深入了许多,由于之前太懒,而且对lua源码中“乱78糟“


YOLOv8【第十三章:模型压缩与极致优化篇·第4节】LAMP 剪枝算法——无需超参的自动化剪枝策略! 🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。 阅读详情

相关推荐

DAC8568控制器实战:如何用STM32实现多通道同步输出(附完整代码)

本文详细介绍了如何使用STM32微控制器驱动TI的DAC8568多通道DAC控制器,实现高精度的多通道同步模拟信号输出。内容涵盖硬件设计要点、SPI时序精准配置、驱动层命令构建,并重点解析了通过LDAC引脚实现同步更新的核心策略,提供了完整的代码框架和实战案例,帮助工程师快速解决多通道同步输出的工程难题。

weixin_29179311的博客 169

Lua与c++交互实战基础篇

本课程从实战角度讲解了流行的高性能脚本Lua与c++的联合开发,这套方案已经被大量的对性能由要求的系统使用,成为了高性能脚本的唯一方案,像大量的游戏在使用lua,比如魔兽世界、博德之门、仙剑奇侠传五等,高性能的视频应用也在用lua&c++(比如笔者的公司),还有近击败了韩国围棋的AlphaGo也是使用了 c++&lua;的方案。

CloudCompare实战:5分钟搞定点云数据预处理(含常见格式转换技巧)

本文提供了一套基于CloudCompare的5分钟点云数据预处理实战指南。文章详细讲解了如何利用这款开源工具,快速完成点云数据的格式转换(如LAS转PLY)、统计离群值降噪、体素网格下采样以及交互式裁剪等核心操作,帮助用户高效清理和规整杂乱数据,为后续分析建模奠定基础。

weixin_29207533的博客 475

C++返回table给lua

//定义函数(返回table) int func_return_table(lua_State *L) {  lua_newtable(L);//创建一个表格,放在栈顶  lua_pushstring(L, "mydata");//压入key  lua_pushnumber(L,66);//压入value  lua_settable(L,-3);//弹出key,value,并设置到ta

浓浓的巧克力 1万+

PLDM入门(七):FRU Data Format

每个字段为TLV(Type-Length-Value)格式,具体类型、长度范围和值定义需参考。通过条件过滤(记录句柄、类型、字段类型等)分块获取FRU记录数据(可选功能)。整个FRU数据表由多个FRU记录数据块组成,每个数据块对应表2的结构(即包含。决定,每个字段按顺序排列(Type→Length→Value)通过分块传输方式写入FRU记录表数据(需终端支持写入操作)。(文档未提供表5内容,需结合标准文档完整版)。、字段数量、编码类型及具体字段的TLV数据)。无请求数据(空请求)。

weixin_44032634的博客 1762

2D激光slam数据集的下载与测试

参考博客: https://blog.youkuaiyun.com/qq_24894159/article/details/81265991 https://blog.youkuaiyun.com/fk1174/article/details/52673413#commentBox 数据集下载与生成 下载数据集 下载网址: http://ais.informatik.uni-freiburg.de/slamevaluation/datasets.php 进去网站后点你想下载的对应的"download log file" 然后你

老李的博客 4025

LUA-c++交互篇-c++向lua传递table

LUA-c++交互篇-c++向lua传递table1.代码2. 测试2.1 c++代码段 1.代码 // An highlighted block typedef unordered_map<string, double> sdmap; static void addDic(lua_State* L, sdmap& mp) { sdmap::iterator it = mp.begin(); lua_newtable(L);//创建一个表格,放在栈顶 while (it != m

qq_37080133的博客 940

channel || channelGroup || ctx.writeAndFlush()发送字符串消息客户端接收不到的原因

一、原因 网络上传播的数据都是字节(二进制数据)类型。我们如果直接向网络流里面写入一个对象(如:String对象),是无法传输的。只有将对象序列化(转换为可以传输的字节类型)之后,才可以进行传输。所以问题的根源就很清楚了,需要把字符串转换成字节进行传输。、 二、解决办法 1、手动序列化 服务端: channelGroup.writeAndFlush(Unpooled.copiedBuffer("【客户端】"+remoteAddress+"已下线"+format.format(new Date()), Cha

haohaoxuexiyai的博客 4060

Lua: 在C++中将table如何传入到lua中

例一是参考别人的: //定义函数(返回table) int func_return_table(lua_State *L) { lua_newtable(L);//创建一个表格,放在栈顶 lua_pushstring(L, "mydata");//压入key lua_pushnumber(L,66);//压入value lua_settable(L,-3);//弹出key,value,并

D.D.U的博客 6529

遥感数据处理必看:哨兵1 SLC与GRD预处理差异全解析

本文详细解析了哨兵1号卫星SLC与GRD数据的预处理差异,从数据基础认知到实战应用全流程对比。重点介绍了SLC数据的轨道校正、辐射校正等关键步骤,以及GRD数据的简化处理流程,帮助用户根据应用场景选择合适数据类型。通过SNAP等工具的实际操作示例,提升遥感数据处理效率。

weixin_29035405的博客 339

Kali实战:构建安卓远程监控工具,实现拍照、定位与信息获取

本文详细介绍了如何使用Kali Linux构建安卓远程监控工具,实现拍照、定位与信息获取功能。通过Metasploit框架生成安卓载荷,部署到目标设备并建立连接,执行远程监控操作如获取位置信息、拍照和读取通讯录。文章还提供了进阶技巧与问题排查方法,强调法律与道德考量。

weixin_28716443的博客 239

Lua学习笔记1

今天上班的时候和程序对一个功能的程序接口,需求是这样的:脚本代码根据配置文件生成一组中奖信息,用table来保存,然后将这个table传给程序接口,程序根据这个table中的数据向玩家显示中奖界面。很简单的一个功能,脚本这边的函数很快就写完了,然后我就琢磨着程序的接口应该怎么写,由于之前没有试过在程序接口中访问lua脚本传过来的table,所以遇到了一些麻烦,上网搜了一下相关资料,总算搞清楚了。现

isaf的专栏 1万+

Sigrity Power DC Single-BoardPackage IR Drop Analysis模式进行单板压降仿真分析操作指导

如果需要单独对某个via设置参数,右侧选择Setup by padstack,下方下拉选择某个via,单独设置参数即可。举例:板厚1.6mm,内层1OZ(1.2mil,即0.03mm),铜皮宽度1mm,20度温升,允许通流I为2.5A。目的是模拟实际情况,via的孔壁电镀1mil,中间是空心的,让via不完全被填充金属成为实心via。Upper/lower Tolerance:上下公差,设置为5%,也就是压降允许的范围。电流密度计算公式:J=I/A(J为电流密度,I为电流,A为横截面积)

weixin_54787054的博客 695

c,c++调用lua脚本,并传入table,for循环构造table

使用c 和c++调用lua脚本时,有时需要传入比较复杂的参数,所以先转化成table比较好: c++代码: 好多代码都是连续很多语句压栈,但是有时候不确定长度的时候就显得很不好用,使用for循环就比较好。要注意的是,每次入栈key-value键值对,都需要将他们弹出放入table,如下: #include <stdio.h> #include<stdlib.h> #...

qq_40340448的博客 761

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

图解lua和C——table传递参数过程

先写测试lua脚本: local mytable = require("mytable") local tb = {"hello", "world"} local element = mytable.get(tb, 1) 这个mytable就是我们用C语言编译的库,给lua调用。 local element = mytable.get(tb, 1) 这个函数从lua向c传递了2个参数,第一个参...

斧冰 2462

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

lua调C的返回table

第一个问题是lua调C的返回值的问题  //测试返回table /**//**  下面代码相当lua如下:  function return_table()  local t = {}  t.result = true  t.data = "hello"  return t  end  */ int tableReturnTable(lua_State

过期的码农 1702

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

lua 和 C 语言进行交互 —— 如何传递table

http://blog.youkuaiyun.com/cjfeii/article/details/25593509 方法1: 采用 lua_pushstring/lua_pushnumber 传递key、value,然后通过 lua_settable 设置 table 中的kv对,like this: [cpp] view plain copy  print?

MyDriverC 1121

c语言中怎么编程添加table,Lua教程(三):C语言、C++中调用Lua的Table示例

从写上一篇Lua的文章到现在,已经过去半月有余了,是时候让自己的Lua状态refresh一下了。本教程将介绍Lua的栈及基本栈操作,同时还有如何在C/C++代码里面读取Lua的Table。理解Lua栈Lua通过一个“虚拟栈”与C/C++程序进行数据交互,所有的Lua C API都是通过操作这个栈来完成相应的数据通信。 Lua的这个“虚拟栈”解决了C/C++程序与Lua程序通信的两大问题:1.Lua...

weixin_35679269的博客 784

C/C++代码里面读取Lua的Table

本教程将介绍Lua的栈及基本栈操作,同时还有如何在C/C++代码里面读取Lua的Table。

hanxiaoqiag的专栏 5794

C与Lua交互之将C结构体组成table传递到Lua

概述前面的Lua与C交互之函数注册中讲述了怎么将C函数注册到Lua中让Lua使用。当Lua中调用C提供的获取数据的接口时,C怎么将多个结构体类型转换成Lua的嵌套table类型呢?下面通过一个例子来讲解例子详解C数据类型typedef struct student { int age; ///&lt; 年龄 int grade; ///&lt; 年级 char name[32];...

奋斗Andy的博客 6592

Lua向C函数中传递table参数

传递纯数组参数 test.lua mytest = nil mytest = require "iTest" if not mytest then print("Failed to require iTest!") else print("Succend to require iTest!"); end function TestFunc() local testtabl = {4,8,9,7,1,0,3,2,6,5} --需要传递的table print("Func_ma..

像个博客 2377

lua c结构体转table

lua table数据类型和c结构体数据类型相互转换 本周有个任务,是将json数据和C结构体数据进行互相转换,初一看很简单,有两个方案去做。但是都是很麻烦,要么做起来简单,要么工作量大,要么工作量少,难度极高,最后找到一个折中的办法,就是通过修改源码来提供捷径。 问题描述: 公司的游戏服务器是由c++实现的,而客户端是android或者ios上实现的,这时的数据交互就是打包二进制数...

C_Creator的博客 2881

c/c++_Lua交互----关于Lua中table类型的使用实例

lua中的复合类型 只有table 类型,你可以当做任意容器使用  ,比如 数组    PHP中的关联数组  C++中的 std::map 等等  而且提供了很方便的使用 下面是lua中 table类型的使用 c++加载代码  #include "string.h" extern "C" { #include "lualib.h" //包含lua lib #include "lau

Programmer小卫 3062

如何在Lua与C/C++之间实现table数据的交换

  之前在《C/C++和Lua是如何进行通信的?》一文中简单的介绍了lua与宿主之间的通信。简单的说两种不同的语言之间数据类型不一样又如何进行数据交换呢?那就是lua_State虚拟栈,通过栈操作和lua库函数,我们很轻松就能完成两者之间的数据交换。   开始之前,明确几个问题,lua中的虚拟栈的索引编号问题(我们假设栈大小为n),编号1是栈底,n视栈顶,编号-1是栈顶,-n是栈底。lu...

weixin_34174322的博客 299

在C++中遍历Lua文件中的表格(Table)数据

然后,通过 lua_getglobal() 函数获取了全局变量 myTable 的值,并使用 lua_istable() 函数进行了类型校验。在上面的代码中,我们使用 lua_pushvalue() 函数将 key 入栈,并在输出时使用 lua_tostring() 将 key 转换为字符串形式。这样可以确保正确地处理数字键。如果你想将 key 的值更改为数字,并且使用数字作为 Lua table 的键,你可以使用 lua_pushnumber() 函数将数字值入栈,并在后续处理中使用这个值作为 key。

875

C开发lua模块(二) --- 操作table和调用lua函数

此篇是上篇入门篇的后续文章,上篇地址:http://blog.youkuaiyun.com/zhang197093/article/details/76400871 C语言没有类似 lua_pushtable 和 lua_totable 的方法,这也很容易理解,因为C语言中没有一种数据类型可以和lua中的table相对应的,那C函数怎么操作table类型的参数或者返回table类型的结果呢,lua API中

zhang197093的博客 1万+
上一篇: windows下编译lua源码
下一篇: lua调用C函数
CekineLin
博客等级 码龄15年 1粉丝 40原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值