在Lua解释器中注册自定义函数库
本文目录
- 1、引言
- 2、注册原理
- 3、实例
- 4、程序验证
文章对应视频教程:
暂无,可以关注我的B站账号等待更新。
点击图片或链接访问我的B站主页~~~
1、引言
在现代软件开发中,Lua因其轻量级、高效和可嵌入性而被广泛使用。作为一种灵活的脚本语言,Lua不仅能够独立运行,还能轻松地嵌入到其他编程语言中。无论是在游戏开发、嵌入式系统,还是数据处理等领域,Lua都展示了其强大的能力。然而,仅仅依靠Lua的内置函数库往往不足以满足复杂应用的需求。在这种情况下,开发者需要将自定义函数库注册到Lua解释器中,从而扩展其功能,满足特定的应用场景。本文将深入探讨如何在Lua解释器中注册自定义函数库,通过实例讲解和代码示范,帮助读者掌握这一实用技术。
2、注册原理
在Lua解释器中注册自定义函数库的过程实际上是将C/C++等其他语言编写的函数暴露给Lua脚本,以便Lua能够调用这些函数。这种机制通过Lua的C API实现,具体原理可以分为以下几个步骤:
创建库函数:首先,需要用C/C++编写自定义的库函数。每个函数必须遵循Lua规定的函数签名,即返回类型为int,参数为lua_State*。这个签名使得Lua解释器能够正确地处理函数的参数和返回值。
定义库的函数表:在C/C++代码中,定义一个结构体数组来存储库中的所有函数。每个数组元素包含函数名和函数指针。这个数组通常以NULL作为结束标志。:首先,需要用C/C++编写自定义的库函数。每个函数必须遵循Lua规定的函数签名,即返回类型为int,参数为lua_State*。这个签名使得Lua解释器能够正确地处理函数的参数和返回值。
定义库的函数表:在C/C++代码中,定义一个结构体数组来存储库中的所有函数。每个数组元素包含函数名和函数指针。这个数组通常以NULL作为结束标志。
static const luaL_Reg mylib[] = {{"myfunction", myfunction},{NULL, NULL}
};
编写库的注册函数:该函数会将函数表注册到Lua解释器中。通常,这个函数会调用luaL_newlib或luaL_register(取决于Lua的版本)来创建一个新的Lua表,并将所有函数添加到这个表中。
int luaopen_mylib(lua_State *L) {luaL_newlib(L, mylib);return 1;
}
使用luaL_requiref进行注册:在初始化阶段,通过luaL_requiref函数注册并加载库。这个函数将库注册到Lua解释器中,并可以选择将其放入全局命名空间。
luaL_requiref(L, "mylib", luaopen_mylib, 1);
3、实例
创建文件lua_lib.c
,实现函数和库注册,内容如下:
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"typedef struct {int x;int y;
} rectangle;#define MAX_OBJ_NUM 10static rectangle obj[MAX_OBJ_NUM] ;
static int obj_num = 0;static int create_rectangle(lua_State *L)
{if(obj_num >= 9 ){lua_pushinteger(L,-1);return 1;}lua_pushinteger(L,obj_num);obj_num++;return 1;
}
static int set_xy(lua_State *L)
{int index = lua_tointeger(L, 1);int x = lua_tointeger(L, 2);int y = lua_tointeger(L, 3);obj[index].x = x;obj[index].y = y;return 0;
}static int get_area(lua_State *L)
{int index = lua_tointeger(L, 1);int obj_area = obj[index].x * obj[index].y ;lua_pushinteger(L,obj_area);return 1;
}static int get_perimeter(lua_State *L)
{int index = lua_tointeger(L, 1);int obj_peri = (obj[index].x + obj[index].y)*2 ;lua_pushinteger(L,obj_peri);return 1;
}static const luaL_Reg rectangle_lib[] = {{"create_rectangle", create_rectangle},{"set_xy", set_xy},{"get_area", get_area},{"get_perimeter", get_perimeter},{NULL, NULL} // 数组的结束标志
};int luaopen_rectangle(lua_State *L) {luaL_newlib(L, rectangle_lib); // 创建一个新的表并将函数注册到表中return 1; // 将新创建的表压入栈中
}
在main.c
中调用
luaL_requiref(L, "rectangle", luaopen_rectangle, 1);
创建lua的测试代码:
local index = rectangle.create_rectangle()
if index == -1 thenprint("Failed to create rectangle: maximum number reached")
elserectangle.set_xy(index, 5, 10)local area = rectangle.get_area(index)local perimeter = rectangle.get_perimeter(index)print("Rectangle Index:", index)print("Area:", area) -- 输出:Area: 50print("Perimeter:", perimeter) -- 输出:Perimeter: 30
end
复制这部分代码到对用的项目中,即可。
4、程序验证
进入项目的工程路径,进行编译,编译通过。
可以看到图中圈起来的文件,也就是我们写的代码已经参与编译了。
运行生成的程序,执行我们上一节写好的lua代码,效果如下:
说明我们自己注册的函数库成功,并能得到正确运行。
时间流逝、年龄增长,是自己的磨炼、对知识技术的应用,还有那不变的一颗对嵌入式热爱的心!
点赞o( ̄▽ ̄)d、关注(o)/~、评论(▽)!
相关文章:
在Lua解释器中注册自定义函数库
本文目录 1、引言2、注册原理3、实例4、程序验证 文章对应视频教程: 暂无,可以关注我的B站账号等待更新。 点击图片或链接访问我的B站主页~~~ 1、引言 在现代软件开发中,Lua因其轻量级、高效和可嵌入性而被广泛使用。作为一种灵活的脚本语言…...
UKP3D用户定制图框的思路
为用户定制图框,记录以下图框制作方法,便于用户自已修改。 1.轴测图与平面图的图框: 1.1.图框在安装目录下,例如:E:\Program Files (x86)\UKSoft\UKP3d9.2\config\TemplateAndBlock\CADTemplate\ 1.2.配置文件在安装…...
事务并发问题 与 事务隔离级别
来源:微软sql文档 https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/transaction-isolation-levels?viewsql-server-ver16 事务隔离级别,是一种衡量事务隔离程度的指标。 事务隔离级别的定义,取决于能不能解决以下几个问…...
云原生Kubernetes系列项目实战-k8s集群+高可用负载均衡层+防火墙
一、Kubernetes 区域可采用 Kubeadm 方式进行安装: 名称主机部署服务master192.168.91.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.91.11docker、kubeadm、kubelet、kubectl、flannelnode02192.168.91.20docker、kubeadm、kubelet、kubectl、flan…...
MFC为什么说文档在数据的保存和给用户提供数据之间划分了清晰的界限?
MFC MFC(Microsoft Foundation Classes)是微软为Windows应用程序开发提供的一套C类库,它在设计上强调了"文档-视图"(Document-View)架构。这种架构将文档(Document)与用户界面&#…...
SAS:PROC SQL和ANSI标准
文章来源于SAS HELP PROC SQL 和ANSI SQL 的区别——图表和视图名称的作用域规则不同 例1:匹配数据集相关名称 当PROC SQL匹配数据集相关名称时,会依次进行3个步骤:1、有别名,用别名匹配;2、1匹配失败,在无…...
使用mysql_config_editor可以为特定的MySQL服务器或客户端程序设置登录路径
login_path 介绍 在 MySQL 中,login_path 通常不是 MySQL 服务器配置或 SQL 语句的一部分。但是,它经常与 MySQL 的命令行工具 mysql_config_editor 一起使用,这是一个允许用户安全地存储认证凭据(如用户名、密码和连接参数&…...
gridview的模板按钮如何判断用户点击的是哪一行
在asp.net的 GridView 控件中,判断用户点击的是哪一行通常可以通过处理 GridView 的 RowCommand 事件来实现。RowCommand 事件会在 GridView 的每个按钮(除非另有指定的CommandName)被点击时触发,并且事件参数中包含了足够的信息来…...
虚拟化 之三 详解 jailhouse(ARM 平台)的构建过程、配置及使用
嵌入式平台下,由于资源的限制,通常不具备通用性的 Linux 发行版,各大主流厂商都会提供自己的 Linux 发行版。这个发行版通常是基于某个 Linux 发行版构建系统来构建的,而不是全部手动构建,目前主流的 Linux 发行版构建系统是 Linux 基金会开发的 Yocto 构建系统。 基本环…...
数据安全:Web3时代的隐私保护新标准
随着数字化时代的到来,我们的生活已经完全依赖于互联网和数据交换。然而,随之而来的是对个人隐私和数据安全的日益关注。在这个信息爆炸的时代,数据泄露、个人隐私侵犯和网络攻击等问题日益突出,而Web3技术的崛起正带来了一种全新…...
STM32串口不定长接收空闲中断
目录 1. 开启串口空闲中断2. 合理开关中断3. 串口发送函数 1. 开启串口空闲中断 最近接触到的 Modbus RTU 项目使用到了串口接收中断和空闲中断。记录一下 初始化可以直接套用正点原子的初始化,只需要添加一行即可 USART_ITConfig(USART1, USART_IT_IDLE, ENABLE)…...
Ubuntu 设置开机启动脚本
在/etc/systemd/system/目录下创建对应的server服务 如:/etc/systemd/system/test-script.service [Unit] DescriptionTest Script Service Afternetwork.target[Service] Typeoneshot ExecStart/path/to/test-script.sh[Install] WantedBymulti-user.target替换/…...
C# Task 包含 await ConfigureAwait CancellationTokenSource
Task以下是 Task 类的一些关键特性和用法:以下是一些使用 Task 的示例:创建并启动一个任务使用 await 等待任务完成处理任务异常使用 Task<TResult> 获取结果取消任务总结 await暂停方法执行:非阻塞调用:任务结果获取&#…...
Python数据分析与建模库-02科学计算库Numpy01-05合集
1、该视频主要讲述了南派(NumPy)的核心操作和数据结构,以及如何使用NumPy库读取和处理数据。 2、该视频主要讲述了在编程中,如何对数组或矩阵中的元素进行判断和操作,以及在单排中如何进行类型转换。 3、该视频主要讲…...
【前端项目笔记】1 登录与登出功能实现
项目笔记 ☆☆代表面试常见题 前后端分离:后端负责写接口,前端负责调接口。 登录/退出功能 登录业务流程 登录页面:用户名密码 调用后台接口进行验证 通过验证,根据后台响应状态跳到项目主页 登录业务相关技术点࿱…...
是字符串定义以及在C语言中字符串是如何表示的
字符串(String)是由零个或多个字符(包括空格)组成的有限序列,常用于文本数据的存储和处理。在编程中,字符串是常见的数据类型。 在C语言中,字符串不是一种内置的数据类型,但C语言提…...
辽宁普通测径仪升级智能测径仪后都有哪些改进?
关键字: 普通测径仪, 智能测径仪, 测径仪升级, 测径仪特点, 智能测径仪优势, 目前多数厂家测径仪的数据处理方式是单片机计算出最终结果,然后传输到工控机后期处理。这样的电路系统对轧钢现场的高温、高粉尘和强电磁干扰的环境适应性很差,使得同一厂家、…...
【微信小程序】事件分类以及阻止事件冒泡
在微信小程序中,事件分为冒泡事件和非冒泡事件两大类,它们的区别在于事件是否能从原始触发组件开始,向父级组件传播(即“冒泡”)。 冒泡事件:当一个组件上的事件被触发后,不仅当前组件会接收到这…...
踩坑!被node-sass折磨的一天
文章目录 被node-sass折磨的一天折磨过程了解原因注意事项 被node-sass折磨的一天 折磨过程 起因是要开发一个老项目,照常拉代码、下依赖、启动三步走 依赖开始下载不对了,以为是node版本问题,寻找node-sass对应的node版本 利用nvm&#…...
App UI 风格打造独特体验
App UI 风格打造独特体验...
【学习笔记8】阅读StyleID论文源码
论文【链接】 源码【链接】 一、DDIM eta ddim_step表示执行几轮去噪迭代,eta表示DDPM和DDIM的插值系数。当eta0时,为DDPM;当eta≠0时,为DDIM。 参考 DDIM 简明讲解与 PyTorch 实现:加速扩散模型采样的通用方法 【s…...
wordpress旅游网站模板
旅行社wordpress主题 简洁实用的旅行社wordpress主题,适用于旅行社建网站的wordpress主题模板。 https://www.jianzhanpress.com/?p4296 旅游WordPress主题 简洁实用的旅游WordPress主题,适合做旅游公司网站的WordPress主题模板。 https://www.jian…...
vs2019 c++20规范 STL 库中头文件 <atomic> 源码注释及探讨几个知识点
(1 探讨一) 模板类 atomic 的继承关系与数据结构如下: (2 探讨二 ) 可见 atomic 的 fetch_xx 函数,返回的都是 atomic 中存储的旧值。测试如下: 谢谢...
Flink任务如何跑起来之 2.算子 StreamOperator
Flink任务如何跑起来之 2.算子 StreamOperator 前文介绍了Transformation创建过程,大多数情况下通过UDF完成DataStream转换中,生成的Transformation实例中,核心逻辑是封装了SimpleOperatorFactory实例。 UDF场景下,DataStream到…...
学习笔记——路由网络基础——路由优先级(preference)
1、路由优先级(preference) 路由优先级(preference)代表路由的优先程度。当路由器从多种不同的途径获知到达同一个目的网段的路由(这些路由的目的网络地址及网络掩码均相同)时,路由器会比较这些路由的优先级,优选优先级值最小的路由。 路由来源的优先…...
数据预处理——调整方差、标准化、归一化(Matlab、python)
对数据的预处理: (a)、调整数据的方差; (b)、标准化:将数据标准化为具有零均值和单位方差;(均值方差归一化(Standardization)) (c)、最值归一化,也称为离差标准化,是对原始数据的…...
opencv_特征检测和描述
理解特征 寻找独特的特定模式或特定特征,可以轻松跟踪和比较。 拼图:在图像中搜索这些特征,找到它们,在其他图像中查找相同的特征并对齐它们。而已。 基本上,角被认为是图像中的好特征。 在本单元中,我…...
CID引流电商下的3C产品选品策略深度解析
摘要:随着电商行业的迅猛发展和消费者需求的日益多样化,CID引流电商作为一种新兴的电商模式,逐渐受到了广泛关注。在这一模式下,3C产品作为高客单价、高技术含量的代表品类,其选品策略的制定显得尤为重要。本文将从多…...
DeepSORT(目标跟踪算法)中的状态向量与状态转移矩阵
DeepSORT(目标跟踪算法)中的状态向量与状态转移矩阵 flyfish 状态转移矩阵(State Transition Matrix)F的构造 这篇是一定要看的,拖到文章的最后部分,需要理解状态转移矩阵怎么来的,怎么是这个…...
李宏毅深度学习01——基本概念简介
视频链接 基本概念 Regression(回归): 类似于填空 Classification(分类): 类似于选择 Structure Learning(机器学习): ?? 机器学习找对应函数…...
哪个网站做ic外单好/济南今日头条最新消息
点击左上方蓝字关注我们11月7日飞桨领航团杭州站和太原理工大学站顺利进行,开发者们围坐一起,与行业资深专家对话,感受深度学习的魅力,来一起回顾一下~网易云音乐机器学习平台化赋能机器学习平台技术架构包含资源层、调…...
wordpress动转换标签别名/设计网站接单
如何映射网络驱动器,也就是把远程硬盘本地化 【局域网才行】 1、如果你要映射网络磁盘,那首选你当然是应该拥有"网络磁盘",网络磁盘其实只是一个网上的共享文件夹,在中国,IP固定的服务器才能设置网络上可用的共享文件夹,如果是本地的话,一般指的是局域网共享文件夹 2…...
确定网站推广目标/优化大师有用吗
这个不是造轮子,只是整理轮子,我在搜索引擎里,遇到的思路都是第一种思路(至少按照标题那个关键词搜索是这样的)所以我想发出来。一是如果遇到大神帮忙发现了方案一的问题与弊病,那就更好啦。二是让大家不会像我一样,只…...
通过网站如何做海外贸易/慧聪网
去Oracle行动 最近公司要发展海外项目,所以要将现有的系统全部平移过去,另外数据库也要从原来的Oracle变为Mysql。公司的数据库交互层面使用的是Mybatis,而Oracle与Mysql也有一些语法上的不同。所以在项目中的Sql要改动,但是多个…...
做搜狗pc网站优化/建立企业网站步骤
第一步在原有基础上引入依赖:org.jetbrains.kotlinkotlin-stdlib-jre8${kotlin.version}org.jetbrains.kotlinkotlin-reflect${kotlin.version}com.fasterxml.jackson.modulejackson-module-kotlin2.9.4.1版本号多去少补:trueUTF-8UTF-81.81.2.20构建方式修改:${project.basedi…...
做soho外贸网站/怎样自己做网站
在介绍KDE和Gnome之前,我们有必要先来介绍UNIX/Linux图形环境的概念。对一个习惯Windows的用户来说,要正确理解UNIX/Linux的图形环境可能颇为困难,因为它与纯图形化Windows并没有多少共同点。Linux实际上是以UNIX为模板的,它继承了…...