使用C语言构建Lua库

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+") dotable.insert(arr, tonumber(num))
end
-- 计算连续差值的最大和
local result = maxdiffsum.maxDifferenceSum(arr, #arr)-- 输出结果
print("连续差值的最大和为: " .. result)

 运行成功:

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

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

相关文章

大语言模型的模型量化(INT8/INT4)技术

目录 一、LLM.in8 的量化方案 1.1 模型量化的动机和原理1.2 LLM.int8 量化的精度和性能1.3 LLM.int8 量化的实践 二、SmoothQuant 量化方案 2.1 SmoothQuant 的基本原理2.2 SmoothQuant 的实践 三、GPTQ 量化训练方案 3.1 GPTQ 的基本原理3.2 GPTQ 的实践 参考资料 一、LLM.i…

SD-WAN企业组网:与传统组网有何不同?

很多企业已经尝试过使用SD-WAN来进行组网。SD-WAN代表着一种新兴的网络连接技术&#xff0c;与传统的网络架构相比&#xff0c;它在许多方面都有明显的不同。 SD-WAN基于软件定义网络&#xff08;SDN&#xff09;的概念&#xff0c;提供集中化的网络控制和智能优化&#xff0c;…

macos重装系统 启动U盘制作方法 - createinstallmedia 命令使用方法总结

macos重装系统比windows要稍微复杂一些&#xff0c;不过还好&#xff0c;macos系统安装app这个Apple官方提供的系统软件里面默认就内置了一个可用为我们制作启动盘的工具 createinstallmedia 我们下载的apple安装镜像要门是 dmg/pkg/iso 的压缩档案格式的&#xff0c;要么是 x…

电子行业数字工厂管理系统解决方案

电子行业数字工厂管理系统解决方案是针对电子企业特定需求而设计的一套综合管理系统&#xff0c;旨在通过数字化手段提升生产效率、优化资源配置、降低运营成本&#xff0c;并确保高品质产品的输出。以下是一个详细的电子行业数字工厂管理系统解决方案的概述&#xff1a; 一、系…

WebAssembly最详教程

WebAssembly 是一种新的编码方式&#xff0c;可以在现代的 Web 浏览器中运行——它是一种低级的类汇编语言&#xff0c;具有紧凑的二进制格式&#xff0c;可以接近原生的性能运行&#xff0c;并为诸如 C/C、C# 和 Rust 等语言提供编译目标&#xff0c;以便它们可以在 Web 上运行…

面试 | Python 自动化测试技术面试真题

本文为面试某公司测试开发&#xff0f;自动化测试工程师时的面试题笔记。 全部笔试内容没有全部写全&#xff0c;只贴通用性的技术相关的笔试面试题&#xff0c;至于测试理论和团队管理的问题&#xff0c;都是大同小异&#xff0c;也没什么实际的参考价值。 1.直接手写一个 P…

AWS云服务器选择最佳区域

2024年&#xff0c;随着全球云计算的持续发展和AWS在全球不断扩展的数据中心网络&#xff0c;选择合适的AWS云服务器区域成为了企业和开发者需要认真考虑的问题。九河云告诉你在做出选择之前&#xff0c;需要考虑以哪些关键因素&#xff1a; 地理位置和用户分布 选择AWS云服务…

ZAN与Mysten Labs合作推进Web3基础设施开发

Mysten Labs是一家Web3基础设施公司&#xff0c;也是Sui区块链的开发公司&#xff0c;今天宣布与蚂蚁数字科技的技术品牌ZAN建立合作伙伴关系。 通过整合Sui&#xff0c;ZAN旨在加速其Web3应用程序的开发和采用。该合作将专注于为Mysten Labs在两个关键领域提供技术支持&#…

分班查询一键发布,老师们都在用

新学期的钟声即将敲响&#xff0c;校园里又将迎来一批充满好奇和期待的新生。对于老师们来说&#xff0c;这不仅仅是一个新起点&#xff0c;更是一项挑战——如何高效而准确地将新生的分班信息传达给每一位家长。传统的方法是通过私信逐一发送&#xff0c;这不仅耗时耗力&#…

opencv-python图像增强二:图像去雾(暗通道去雾)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、简介&#xff1a;二、暗通道去雾方案简述&#xff1a;三、算法实现步骤3.1最小值滤波3.2 引导滤波3.3 计算图像全局光强 四&#xff1a;整体代码实现五&#xf…

加密软件有哪些常见的安全特性

1. 数据加密 核心功能&#xff1a;加密软件的核心在于对数据进行加密处理&#xff0c;通过复杂的加密算法&#xff08;如AES、RSA等&#xff09;将明文数据转换为密文&#xff0c;确保数据在存储和传输过程中的安全性。 透明加密&#xff1a;部分加密软件支持透明加密功能&am…

代码+视频,R语言VRPM绘制多种模型的彩色列线图

列线图&#xff0c;又称诺莫图&#xff08;Nomogram&#xff09;&#xff0c;它是建立在回归分析的基础上&#xff0c;使用多个临床指标或者生物属性&#xff0c;然后采用带有分数高低的线段&#xff0c;从而达到设置的目的&#xff1a;基于多个变量的值预测一定的临床结局或者…

排队免单小程序

本文来自&#xff1a;排队免单小程序 - 源码1688 应用介绍 排队免单小程序是基于移动互联网技术开发的平台系统&#xff0c;通过小程序的形式为消费者和商家搭建了一个互动桥梁。以下是对排队免单小程序的详细介绍&#xff1a; 一、基本概念 排队免单小程序是一种创新的营销工…

拯救打工人的4款可ai生成ppt神器大PK,谁是加班狗的最爱?

在忙碌的工作日常里&#xff0c;做PPT常常让不少上班族头疼。晚上加班时&#xff0c;办公室里总能看到那些为了做出完美PPT而熬夜的人。不过现在好了&#xff0c;科技进步带来了好消息&#xff0c;有几款AI生成PPT的神器出现了&#xff0c;今天&#xff0c;咱们就来比一比&…

c++41两头堵模型

直接拷到自己的内存空间 字符串反转 递归&#xff1a;参数的入栈模型 函数的调用模型 先被调用的模型后执行 向局部变量拷贝内存 传两个参数 做函数结果

华为od统一考试B卷【AI面板识别】python实现

思路 n int(input())class Light:def __init__(self, id, x1, y1, x2, y2):self.id idself.x1 x1self.y1 y1self.x2 x2self.y2 y2self.height y2 - y1def get_lights_info(n):lights []for _ in range(n):id, x1, y1, x2, y2 map(int, input().strip().split())lights…

乡村振兴旅游休闲景观解决方案

乡村振兴旅游休闲景观解决方案摘要 2. 规划方案概览 规划核心&#xff1a;PPT展示了乡村振兴建设规划的核心区平面图及鸟瞰图&#xff0c;涵盖景观小品、设施农业、自行车道、新社区等设计元素。 规划策略&#xff1a;方案注重打造大开大合的空间感受&#xff0c;特色农产大观…

安全测试中的权限测试

安全测试中的权限测试&#xff08;或称为访问控制测试&#xff09;是一个关键的组成部分&#xff0c;它确保系统正确地实施了访问控制策略&#xff0c;防止未授权的用户或进程访问敏感信息和功能。 身份验证&#xff1a; 测试系统是否要求用户提供凭据&#xff08;如用户名和密…

负载均衡、高可用

负载均衡 负载均衡&#xff08;Load Balance&#xff09;&#xff1a;可以利用多个计算机和组合进行海量请求处理&#xff0c;从而获得很高的处理效率&#xff0c;也可以用多个计算机做备份&#xff08;高可用&#xff09;&#xff0c;使得任何一个机器坏了整个系统还是能正常…

2024靠谱的网站建设公司推荐

在现在的互联网社会&#xff0c;一个企业的网站往往是潜在客户对该品牌的第一印象来源。也正因如此&#xff0c;选择一个靠谱的网站建设公司对于确保企业在线形象和功能性至关重要&#xff0c;作为建站行业从业人员&#xff0c;我分享几个选择网站建设公司时应考虑的几个关键因…