使用C语言构建Lua库

news2024/9/22 21:21:24

Lua 本身是用 C 语言编写的,因此使用 C 编写扩展可以更好地与 Lua 引擎集成,减少性能瓶颈,同时C 语言提供了对底层硬件和操作系统功能的直接访问能力,让 Lua 可以通过 C 扩展来实现对文件系统、网络等高级功能的支持。因为C 语言非常适合模块化编程,可以很容易地将复杂的 Lua 功能拆分成多个模块或库。

举个例子,某个lua脚本需要一个计算连续差值最大和的功能,可以使用C语言编写出一个Lua库,随后在Lua脚本中导入并使用这个库。

先附上C语言实现此功能的代码:

#include <stdio.h>  
#include <stdlib.h>  
#include <math.h>  
  
int maxDifferenceSum(int arr[], int n) {  
    int maxSum = 0;  
    for (int i = 0; i < n; i++) {  
        int currentSum = 0;  
        for (int j = i; j < n - 1; j++) {  
            currentSum += abs(arr[j] - arr[j + 1]);  
            if (currentSum > maxSum) {  
                maxSum = currentSum;  
            }  
        }  
    }  
    return maxSum;  
}  
  
int main() {    
    int n;  
    printf("请输入数组元素的数量: ");  
    scanf("%d", &n);  
  
    // 动态分配数组内存  
    int *arr = (int *)malloc(n * sizeof(int));  
    if (arr == NULL) {  
        printf("内存分配失败!\n");  
        return 1;  
    }  
  
    printf("请输入 %d 个整数:\n", n);  
    for (int i = 0; i < n; i++) {  
        scanf("%d", &arr[i]);  
    }  
  
    int result = maxDifferenceSum(arr, n);    
    printf("连续差值的最大和为: %d\n", result);    
    // 释放动态分配的内存  
    free(arr);  
  
    return 0;    
}

运行结果如下: 

 这里因为需要构建lua库,所以需要更改格式,将代码转换成功能函数格式,修改完的代码如下:

导入Lua头文件和VS Code调试、编译部分可以参考:在C/C++中嵌入Lua代码及使用VS Code调试-CSDN博客

#include <lua.h>  
#include <lauxlib.h>  
#include <lualib.h>  
#include <stdlib.h>  
#include <math.h>  
  
static int maxDifferenceSum(lua_State *L) {  
    int n = luaL_checkinteger(L, 2);  
    lua_Integer *arr = malloc(n * sizeof(lua_Integer));  
    for (int i = 0; i < n; i++) {  
        lua_rawgeti(L, 1, i + 1);  
        arr[i] = lua_tointeger(L, -1);  
        lua_pop(L, 1);  
    }  
  
    int maxSum = 0;  
    for (int i = 0; i < n; i++) {  
        int currentSum = 0;  
        for (int j = i; j < n - 1; j++) {  
            currentSum += abs(arr[j] - arr[j + 1]);  
            if (currentSum > maxSum) {  
                maxSum = currentSum;  
            }  
        }  
    }  
  
    free(arr);  
    lua_pushinteger(L, maxSum);  
    return 1;  
}
  
static const struct luaL_Reg maxdiffsumlib[] = {  
    {"maxDifferenceSum", maxDifferenceSum},  
    {NULL, NULL}  // 必须以NULL结尾  
};  
  
int luaopen_maxdiffsum(lua_State *L) {  
    luaL_newlib(L, maxdiffsumlib);  
    return 1;  
}

随后编译代码为.so文件,方便Lua脚本导入 :

gcc -shared -fPIC -o maxdiffsum.so -I/usr/include/lua5.4 test.c -llua5.4

 库编译完成后个人推荐编写一个自建库的使用手册,方便以后调整及使用,使用VS Code插件编写的,写起来很快很方便

 接下来即可在Lua脚本中导入编写好的库了,我在项目文件夹中新建了一个名为“include”的文件用于存放自己建立的lua库(非必要),直接将库的.so文件与lua脚本可以不用添加模块路径,但脚本文件或库多了以后会比较难受。

lua代码如下:

-- 添加模块路径
local cpath = package.cpath
package.cpath = cpath .. ";".."./include/maxdiffsum.so"

-- 导入自己制作的maxdiffsum模块
local maxdiffsum = require("maxdiffsum")

-- 使用 io.read() 从用户输入读取数组元素
io.write("请输入一个数字序列,用逗号分隔: ")
local input = io.read()
-- 将输入字符串分割成数组
local arr = {}
for num in string.gmatch(input, "%-?%d+") do
    table.insert(arr, tonumber(num))
end
-- 计算连续差值的最大和
local result = maxdiffsum.maxDifferenceSum(arr, #arr)

-- 输出结果
print("连续差值的最大和为: " .. result)

 运行成功:

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

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

相关文章

The First项目报告:Web3人生模拟器,DegenReborn带你重开币圈

2023年6月14日&#xff0c;ReadON APP的首页上&#xff0c;一篇引人注目的文章《黑客马拉松奖&#xff1a;‘Degenreborn’——Meme与GameFi的梦幻交汇》跃然眼前&#xff0c;该文章巧妙融合了NFT、GameFi及Ethereum等热门话题&#xff0c;为读者带来了一场科技与娱乐的盛宴。 …

万字详述haproxy

目录 写在前面 1、Haproxy简介 2、Haproxy的安装和基本配置信息 2.1、haproxy的安装 2.2haproxy的基本配置信息 2.2.1基本配置文件global参数 2.2.2基本配置文件proxys的相关参数 2.2.2.1 default的相关参数 2.2.2.2 frontend的相关配置 2.2.2.3 backend的相关配置 …

24年下半年软考只剩下3个月时间,来得及准备吗?

过来人告诉你来得及&#xff0c;但是选对科目很重要&#xff01; 一般来说&#xff0c;自学备考软考的时间为4-5个月&#xff0c;如果大家现在才开始备考的话&#xff0c;时间就有点紧张了&#xff0c;需要加倍努力才行&#xff0c;推荐大家可以报考一些相对简单的科目&#x…

Windows Server 2012 R2服务器安装CVE-2024-38077补丁KB5040456的安装及问题解决

Windows 远程桌面授权服务远程代码执行漏洞CVE-2024-38077&#xff0c;该漏洞影响: 远程执行代码&#xff0c;漏洞最高严重性: 严重。本文记录了Windows Server 2012 R2服务器补丁KB5040456的安装及报错“此更新不适用于你的计算机”的问题解决过程。 一、漏洞相关信息 1.影响…

具有 SAM2 分段的 NDVI 无人机

在我们之前的博客文章《OAK相机扩展NDVI功能检测植物健康情况》中&#xff0c;我们探讨了 NDVI 方法以及如何使用多光谱相机计算它。 今天&#xff0c;我们通过使用带有多光谱相机的无人机并使用 SAM2 模型进行场分割和健康比较&#xff0c;将 NDVI 感知提升到一个新的水平。 …

基于Python的孔夫子旧书网热销书籍爬虫与可视化分析报告

摘要&#xff1a;随着社会的不断发展&#xff0c;数据时代的到来&#xff0c;数据的背后是什么&#xff0c;数据有什么用&#xff0c;怎么用庞大的数据来呈现出数据的价值&#xff0c;让我们一起去揭开它神秘的面纱。 以孔夫子旧书网热销书籍5本图书数据爬取为例&#xff0c;介…

免费录屏软件之QQ

录屏太简单了 1、首先下载QQ 2、在随便打开个对话框&#xff0c;再操作1、2步骤即可 3、嫌打开对话框麻烦&#xff1f; 4、打开QQ后直接按下CtrlAltR即可录屏&#xff0c;连对话框都不用打开了&#xff0c;按完快捷键后效果如下&#xff1a; 5、点击右下角开始录屏即可

想在官网中放可以720°交互的3D模型,怎么做?

在官网中放置可以交互的3D模型&#xff0c;可以通过以下步骤实现&#xff1a; 一、准备3D模型 1、设计3D模型&#xff1a; 使用专业的3D建模软件&#xff08;如Blender、3ds Max、Maya等&#xff09;制作符合需求的3D模型。确保模型的尺寸、比例和细节都符合实际要求。 2、…

斜坡函数在PLC中的应用

最近在做项目的时候用到了通过模拟量输出控制设备速度快慢。因为之前大多数是通过端子控制或者是总线的控制方式来控制速度&#xff0c;因此首先尝试了端子控制模拟速度输出。但是由于加速度过大导致设备启动后会快速加速&#xff0c;停止时也会快速减速&#xff0c;不够平滑。…

数据库:数据查询

1 实验目的 掌握SQL语言的数据查询语句,具体包括&#xff1a; SELECT语句的基本用法 使用WHERE子句进行有条件的查询 使用IN&#xff0c;NOT IN&#xff0c;BETWEEN等谓词查询 利用LIKE子句实现模糊查询 利用ORDER子句为结果排序 用…

SQL Server 2022的游标

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) 游标是SQL Serv…

使用 CSS 打印样式为 Web 页面设置专业的打印机效果

对于有打印需求的网页&#xff0c;特别是文章的详情页&#xff0c;需要设置专门的打印样式来适配页面。CSS 打印样式允许你为网页设置专门用于打印的样式。文本就是专门介绍如何使用 CSS 打印样式为 Web 页面设置专业的打印机效果。 media print 通过使用 media print 媒体查…

【轨物洞见】当下是技术创新的好时机

“创新之父”熊比特认为&#xff0c;创新是一个经济学名词&#xff0c;是一种新的生产函数&#xff0c;即通过重新组合从未有过的生产要素来引入现有的生产过程&#xff0c;判断创新的关键是有没有创造价值。熊比特认为&#xff0c;创新是经济发展的根本动力&#xff0c;它包括…

[LitCTF 2023]debase64-入土为安的第十八天

点进去sub_401520(v15, (int)v4) if ( !*a1 )return 0;v2 a1 4;v3 a1;v4 0;v5 0;v13 0;while ( 1 ){v14 -1;for ( i 0; i ! 64; i ){while ( byte_404000[i] ! *v3 ){if ( i 64 )goto LABEL_7;}LOBYTE(v14) i;} LABEL_7:LOBYTE(i) 0;do{while ( byte_404000[i] ! a1…

【三维重建】SpotlessSplats:去除瞬态干扰物的三维高斯喷溅(3DGS)

代码&#xff1a;https://spotlesssplats.github.io 论文&#xff1a;https://arxiv.org/pdf/2406.20055 来源&#xff1a;DeepMind&#xff0c;多伦多大学&#xff0c;斯坦福大学&#xff0c;西蒙弗雷泽大学 提示&#xff1a;关注B站【方矩实验室】&#xff0c;查看视频讲解…

【SQL】有趣的电影

目录 题目 分析 代码 题目 表&#xff1a;cinema -------------------------- | Column Name | Type | -------------------------- | id | int | | movie | varchar | | description | varchar | | rating | float | -…

JDBC如何避免SQL注入

JDBC如何避免SQL注入 一 . 什么是SQL注入 SQL注入&#xff08;SQL Injection&#xff09;是一种代码注入技术&#xff0c;它允许攻击者将或“注入”恶意的SQL命令到后端数据库引擎执行。这些恶意的SQL命令可以执行未授权的数据库查询、修改数据、管理数据库服务器上的文件系统…

2024.8.12 作业

TCP服务器端代码实现 #include <myhead.h> #define SER_PORT 6666 #define SER_IP "192.168.254.129" int main(int argc,const char *argv[]) {//1.创建套接字文件int sfd socket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("socket error");retur…

Echarts-GL和three.js对比,实力在一个档次么?

我们都知道echarts非常好用&#xff0c;简单配置就可以实现各式各样的图表下过&#xff0c;echarts有一个扩展叫echarts-GL&#xff0c;可以实现三维图表效果&#xff0c;那么和three.js相比呢&#xff1f; 一、Echarts-GL的来源 ECharts-GL 是百度开源的一款基于 WebGL 的数据…

PMP和PMI-ACP 考哪个证书好,还是两个都考?

PMP是一个由美国项目管理协会&#xff08;PMI&#xff09;发起的项目管理专业人士或专家资格认证&#xff0c;它评估从业者领导和引导项目团队的能力。PMP在中国早已推广&#xff0c;基于系统项目管理的框架体系&#xff0c;是项目管理领域的基本要求。这个证书知名度很高&…