在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代码,效果如下:
在这里插入图片描述
说明我们自己注册的函数库成功,并能得到正确运行。


时间流逝、年龄增长,是自己的磨炼、对知识技术的应用,还有那不变的一颗对嵌入式热爱的心!

到这里就结束了!希望大家给我的文章和B站视频
点赞o( ̄▽ ̄)d、关注(o)/~、评论(▽)!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/349435.html

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

相关文章

MyBatis使用 PageHelper 分页查询插件的详细配置

1. MyBatis使用 PageHelper 分页查询插件的详细配置 文章目录 1. MyBatis使用 PageHelper 分页查询插件的详细配置2. 准备工作3. 使用传统的 limit 关键字进行分页4. PageHelper 插件(配置步骤)4.1 第一步:引入依赖4.2 第二步:在m…

【SpringBoot整合系列】SpringBoot整合kinfe4j

目录 kinfe4j与Swagger的区别 SpringBoot2.x整合kinfe4j1.添加依赖2.启动类注解3.创建Knife4J配置类4.实体类5.接口admin访问 api访问 常用注解汇总SpringBoot3.x整合Kinfe4j启动报错解决1.更换依赖2.启动类3.配置4.配置类5.参数实体类6.接口admin访问 api访问 各版本注解参照 …

视频美颜工具技术探秘:直播美颜SDK的应用与发展

今天,笔者将深入探讨直播美颜SDK的应用场景和发展趋势,揭示其背后的技术奥秘和潜力。 一、直播美颜SDK的基本原理 直播美颜SDK其基本原理包括以下几个方面: 人脸检测与特征定位 肤色分析与调整 瑕疵修复与细节增强 滤镜和特效应用 二、…

【算法】Graham 凸包扫描算法 ( 凸包概念 | 常用的凸包算法 | 角排序 | 叉积 | Python 代码示例 )

文章目录 一、Graham 凸包扫描算法1、凸包概念2、常用的凸包算法3、Graham 凸包扫描算法 二、Graham 算法前置知识点1、角排序2、叉积3、算法过程分析 三、代码示例1、完整代码示例2、执行结果 使用 Graham 算法绘制的凸包效果 : 博客代码下载 : https://download.csdn.net/d…

算法刷题【二分法】

题目: 注意题目中说明了数据时非递减的,那么这样就存在二分性,能够实现logn的复杂度。二分法每次只能取寻找特定的某一个值,所以我们要分别求左端点和有端点。 分析第一组用例得到结果如下: 成功找到左端点8 由此可知&#xff0…

Spring Boot集成 Spring Retry 实现容错重试机制并附源码

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

verilog阻塞和非阻塞语法

阻塞和非阻塞是FPGA硬件编程中需要了解的一个概念,绝大部分时候,因为非阻塞的方式更加符合时序逻辑设计的思想,有利于时钟和信号的同步,更加有利于时序收敛,所以除非特殊情况,尽量采用非阻塞方式。 1,非阻塞代码 非阻塞赋值,A和B是同时被赋值的,具体是说在时钟的上升…

论文阅读:H-ViT,一种用于医学图像配准的层级化ViT

来自CVPR的一篇文章,https://openaccess.thecvf.com/content/CVPR2024/papers/Ghahremani_H-ViT_A_Hierarchical_Vision_Transformer_for_Deformable_Image_Registration_CVPR_2024_paper.pdf 用CNNTransformer混合模型做图像配准。可变形图像配准是一种在相同视场…

基于单片机的机械手臂控制系统设计

摘 要: 应用单片机 、 Arduino 及机械臂的有关知识,设计一款基于单片机的六自由度机械手臂,并详述其控制系统的软、 硬件设计 。 该机械手臂能够模仿人的上肢完成简单的动作,因此在实验教学演示平台 、 生产或生活中都极具应用价…

Dubbo 3.x源码(20)—Dubbo服务引用源码(3)

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了调用createProxy方法,根据服务引用参数map创建服务接口代理引用对象的整体流程,我们知道会调用createInvokerForRemote方法创建远程引用Invoker,这是Dubbo …

Linux文件系统

目录 1.磁盘的结构 1.1磁盘的物理结构 1.2 磁盘的存储结构 1.3 磁盘的逻辑结构 2.文件系统 在上一篇文章基础IO中,我们主要是讲了被打开的文件与进程的关系,以及操作系统是如何管理这些被打开的文件的,但是磁盘有这么多文件,被打…

QT--DAY1

不使用图形化界面实现一个登陆界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("登录界面");//设置窗口大小this->resize(535,410);//固定窗口大小this->setFixedSize(535,410)…

windows 环境下使用git命令导出差异化文件及目录

一、找出差异化的版本(再此使用idea的show history) 找到两个提交记录的id 分别为: 二、使用git bash执行命令(主要使用 tar命令压缩文件) 输出结果:

上心师傅的思路分享(三)--Nacos渗透

目录 1. 前言 2. Nacos 2.1 Nacos介绍 2.2 鹰图语法 2.3 fofa语法 2.3 漏洞列表 未授权API接口漏洞 3 环境搭建 3.1 方式一: 3.2 方式二: 3.3 访问方式 4. 工具监测 5. 漏洞复现 5.1 弱口令 5.2 未授权接口 5.3.1 用户信息 API 5.3.2 集群信息 API 5.3.3 配置…

kubernetes(k8s)集群部署(2)

目录 k8s集群类型 k8s集群规划: 1.基础环境准备: (1)保证可以连接外网 (2)关闭禁用防火墙和selinux (3)同步阿里云服务器时间(达到集群之间时间同步) &…

pytest并发执行时token异常处理问题

接前面加入钩子函数处理token复用的问题,只保证了用例的串联执行,我的部分测试用例中接入了通义千问的部分接口生成测试数据,七八个场景跑完差不多快要10分钟。考虑使用并发执行。 http://t.csdnimg.cn/ACexL 使用多线程和不使用耗时差距很大…

HyperBDR新版本上线,自动化容灾兼容再升级!

本次HyperBDR v5.5.0版本新增完成HCS(Huawei Cloud Stack)8.3.x和HCSO(Huawei Cloud Stack Online)自动化对接,另外还突破性完成了Oracle云(块存储模式)的自动化对接。 HyperBDR,云原生业务级别容灾工具。支…

Unity资源 之 最受欢迎的三消游戏开发包 - Bubble Shooter Kit 【免费领取】

三消游戏开发包 - Bubble Shooter Kit 免费领取 前言资源包内容领取兑换码 前言 如果你是一名 Unity 游戏开发者,并且正在寻找一种快速、简单的方式来创建自己的三消游戏,那么 Bubble Shooter Kit 就是你所需要的。 资源包内容 Bubble Shooter Kit 是…

代码随想录算法训练营第36期 last day

最后一次更新&#xff0c;之后去复习专业课和简历 583两个字符串的删除操作 自己做出来了&#xff1a; Code: class Solution {public://找到公共子序列的最大长度dp 最小步数串1.size-dp串2.size-dp int minDistance(string word1, string word2) { vector<v…

用智能插件(Fitten Code: Faster and Better AI Assistant)再次修改vue3 <script setup>留言板

<template><div><button class"openForm" click"openForm" v-if"!formVisible">编辑</button><button click"closeForm" v-if"formVisible">取消编辑</button><hr /><formv-i…