lua学习(五)

SGM5860x高精度ADC驱动开发与SPI接口实战指南 本文详细介绍了SGM5860x高精度ADC芯片的驱动开发与SPI接口配置实战。内容涵盖芯片特性、SPI通信设置、寄存器映射、驱动初始化、数据采集处理、校准优化及调试技巧,帮助开发者快速掌握国产24位ADC的应用,提升工业测量项目的精度与稳定性。 阅读详情

上周看了一下lua的package和OO,感觉不错, lua并不像python程序员抨击的那样不优美.

顺便看了一下pil中,  c函数调用lua以及lua调用c函数的内容.
一、c调用lua函数一般的过程是:
1. load一个lua的文件,形成一个闭包并执行它
2. 在栈中压入函数的名称
3. 依次在栈中压入函数的实参
4. 使用lua_pcall调用lua函数。 形式是: lua_pcall(L, 参数个数,结果个数, 错误处理函数在栈中的索引)
    此时此函数相关的栈已经被清空。执行lua完毕后,如果成功,结果依次将压入栈中, 如果不成功,错误信息将 压入栈中
5. 从栈中读取返回结果或者错误信息。
下面是一则实例:
--[[
    func.lua
--]]
function f(x, y)
 return (x^2 * math.sin(y))/(1 - x)
end

/**
 *  main.cpp
 */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

void error (lua_State *L, const char *fmt, ...)
{
 va_list argp;
 va_start(argp, fmt);
 vfprintf(stderr, fmt, argp);
 va_end(argp);
 lua_close(L);
 exit(EXIT_FAILURE);
}

int main (void)
{

 lua_State *L = luaL_newstate();

 lua_cpcall(L, luaopen_base, 0);
 lua_cpcall(L, luaopen_io, 0);
 lua_cpcall(L, luaopen_math, 0);
 lua_cpcall(L, luaopen_string, 0);


 // 载入func.lua,并运行
 if (luaL_loadfile(L, "func.lua") || lua_pcall(L, 0, 0, 0))
  error(L, "cannot run configuration file: %s", lua_tostring(L, -1));

 double x, y;

 printf("请输入一个数字:");
 scanf("%d", &x);
 printf("%d/n", x);

 printf("再输入一个数字:");
 scanf("%d", &y);
 printf("%d/n", y);

 lua_getglobal(L, "f");
 lua_pushnumber(L, x);
 lua_pushnumber(L, y);
 if (lua_pcall(L, 2, 1, 0) != 0)
  error(L, "error running function `f': %s", lua_tostring(L, -1));

 if (!lua_isnumber(L, -1))
  error(L, "function `f' must return a number");
 double z = lua_tonumber(L, -1);
 lua_pop(L, 1); /* pop returned value */


 printf("结果是: /t %d' /n", z);

 lua_close(L);
}

二、lua调用c函数(写成库的例子)
lua调用库在windows下是dll文件,在unix/linux下面是so文件
vs的过程如下:
1. 新建一个dll的工程
2. 定义一个def文件,定义dll的导出,我的mylib.def定义如下:
LIBRARY  mylib.dll
DESCRIPTION "aol's first dll for lua"
EXPORTS
luaopen_mylib
3. 编写库,新建一个cpp文件.
4. 定义库函数,这里以pil的lsin函数,输出传入参数的sin()值
5. 定义luaL_reg数组,这个是注册一系列公开给lua调用的函数数组. 数组最后一个元素必须是 {NULL, NULL} 的luaL_reg结构用来做结束标识.
6. 用luaL_openlib声明主函数
实例如下:
/*
 * main.cpp
 */
#include <math.h>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

static int l_sin (lua_State *L)
{
 double d = luaL_checknumber(L, 1);
 lua_pushnumber(L, sin(d));
 return 1; /* number of results */
}

static const struct luaL_reg mylib [] = {
 {"lsin", l_sin},
 {NULL, NULL} /* sentinel */
};

int luaopen_mylib (lua_State *L)
{
 luaL_openlib(L, "mylib", mylib, 0);
 return 1;
}
生成mylib.dll之后把文件拷入lua的安装根目录就可以调用了.
运行lua,进入lua环境,调用如下(lua版本5.1):
> package.loadlib("mylib.dll", "luaopen_mylib")()
> print(mylib.lsin(10))
-0.54402111088937
>


从jieba分词到BERT-wwm——中文自然语言处理(NLP)基础分享系列(12) 今天是本系列的最后一期,完整代码呈现Huggingface transformers平台上微调BERT-wwm-ext的过程方法。 阅读详情

相关推荐

银河麒麟V10等保加固清单:安全基线配置一篇搞定(附逐项检查表)

通过限制使用SSH直接以root身份登录,禁用公钥登录的方式加强SSH服务的安全性。更改SSH默认端口可在一定程度上防止被黑客使用大批量扫描方式攻击。通过修改SSH的配置文件限制可以使用SSH服务远程管理的主机。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 762

使用 通配符+Lua脚本 删除大批量的Key

使用 通配符+Lua脚本 删除百万/千万级的key

azbh111的博客 1096

基于STM32大棚温湿度检测蓝牙APP控制(原理图+PCB+代码)

(1)通过温湿度传感器检测温湿度并在液晶和APP显示;(2)当湿度超过一定数值时,APP发出报警信息;(3)设置的参数能够掉电存储;(4)可以通过APP指令控制风扇的启动和关闭。

Redis学习笔记17:基于spring data redis及lua脚本批处理scan指令查询永久有效的key

Redis的KEYS和SCAN指令都可以用于在数据库中搜索匹配指定模式的键。然而,它们之间有一些关键的区别;KEYS指令会在整个数据库中阻塞地执行匹配操作,并返回匹配的键列表。如果数据库很大,或者匹配的键很多,将会对性能产生负面影响。而SCAN指令通过游标的方式逐步迭代数据库,每次返回一小部分匹配的键,不会阻塞数据库,可以在不影响其它操作的情况下进行遍历。KEYS指令会返回匹配的键列表,这可能会导致返回的结果集很大,可能会占用大量的内存。

OceanSky的专栏 3116

VC++调用Lua有参数的函数

一如往常以样,无聊的发愣,想想不如在哪里写点东西。想来想去就继续写lua吧,因为发现网上的教程实在是少的可怜。今天写的是使用VC6.0怎么样调用Lua中的一个有参函数,在上一次的教程中我只是写了一个无参的函数,没有写到关于有参的函数,今天就补上,如果你还没有搭建lua环境就看到这

kingsollyu的专栏 4026

lua 的io操作,非常详细。

 Lua 标准库 - 输入输出处理(input and output facilities)责任编辑:cynthia作者:来自ITPUB论坛   2008-02-18   文本Tag: Lua  【IT168 技术文档】I/O库提供两种不同的方式进行文件处理  1、io表调用方式:使用io表,io.open将返回指定文件的描述,并且所有的操作将围绕这个文件描述 

duanxuyun的专栏 10万+

学习Lua脚本语言小成果总结,一

学习LUA的过程总结,一 首先是部分CE成品 function MyAobScan(Bytes) local StartAddress=0; local EndAddress=0x00007fffffffffff; local Scan = createMemScan(); Scan.OnlyOneResult=true; Scan.firstScan(soExactValue, vtByteAr...

Caifanfan0414的博客 4487

LuaLua学习笔记(

LuaLua学习笔记(

FEZ98 1625

Lua 变量的学习

变量在使用前,需要在代码中进行声明,即创建该变量。编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。Lua 变量有三种类型:全局变量、局部变量、表中的域。Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量。局部变量的作用域为从声明位置开始到所在语句块结束。变量的默认值均为 nil。

m0_46413639的博客 234

、一起学习Lua 变量

变量在使用前,需要在代码中进行声明,即创建该变量。编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。Lua变量有三种类型全局变量、局部变量、表中的域。Lua中的变量全是全局变量,哪怕是语句块或是函数里,除非用local显式声明为局部变量。局部变量的作用域为从声明位置开始到所在语句块结束。变量的默认值均为nil。...

m0_66404702的博客 169

学习Lua 变量

变量在使用前,需要在代码中进行声明,即创建该变量。编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。Lua 变量有三种类型:全局变量、局部变量、表中的域。Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量。局部变量的作用域为从声明位置开始到所在语句块结束。变量的默认值均为 nil。

m0_65038841的博客 98

PythonLua 学习比较

模块

glp3329的专栏 1728

lua_gc 源码学习

今天来说说 write barrier 。 在 GC 的扫描过程中,由于分步执行,难免会出现少描了一半时,那些已经被置黑的对象又被修改,需要重新标记的情况。这就需要在改写对象时,建立 write barrier 。在扫描过程中触发 write barrier 的操作影响的对象被正确染色,或是把需要再染色的对象记录下来,留到 mark 的最后阶段 atomic 完成。 和 barrier 相关的

徐中海的专栏[C++] 2580

Lua学习笔记

Lua学习笔记 通过前面4次的学习,我们已经具备了一些基本知识: 1、使用Lua脚本语法 2、编写Lua函数和C函数,并使他们交互 3、表和其他类型的参数的应用 4、处理函数的返回值的方法 很好,很强大。这些知识足以开启Lua世界的大门,现在让我们来真正的进入Lua的世界。 本节的目的:写一套操作动态浮点数组的函数,并把他们封装成库,侧重点为编写函数库的基本套路。  读到这里

Chinamming的专栏 911

Lua基础学习()

上一篇: Lua基础学习()https://blog.csdn.net/sun_zeliang/article/details/86698691   Lua文件I/O 简单I/O模型  简单I/O模型假设有一个当前输入文件和一个当前输出文件,它的I/O操作均作用于这些文件。 打开文件操作语句: file = io.open(filename [,mode]) mode 的值有: ...

智障侠的博客 378

Lua学习面向对象

Lua里面自带是没有面向对象的,但是可以这么实现 面向对象,学习路径应该是这样子的: self,冒号,点的概念--》元表的概念--》对象的概念--》继承/重载self,冒号,点的概念 --self,冒号,点 print("面向对象测试-----------------------------------------------------") --下面的a.test(a,4,6),和b:test...

cmqwan的博客 7666

Lua 基础之扩展应用程序

扩展应用程序 是指以 c 语言为主导,在 c 代码中调用 lua 代码,一种常见的方式是可以把 lua 文件当作配置文件,然后在 c 程序中加载解析

xingxinmanong的博客 951

[Lua学习]读取输入参数

-- lua 输入参数,计算某个整数的阶乘 function fact (n) if n==0 then return 1 else  return n*fact(n-1) end  end  print ("请输入整数:") a = io.read("*num") print (tostring(a).."的阶乘

orangleliu 笔记本 1万+

Lua直接调用动态链接库(DLL或so文件)

原网址: http://my.oschina.net/hac2009/blog/14099?catalog=67125 使用Lua编程,扩展外部接口时,不一定要编写lua专用的dll,使用系统的,或传统的动态链接库也可以,这样更具有通用性。 基本用法: require("alien") --1.加载alien libc = alien.load("msvc

迷茫的小莱 1万+

lua——alien库实现lua调用C动态链接库(dll、so)

我们知道,lua通过lua_State堆栈可以很方便的与C语言进行交互 http://blog.csdn.net/sm9sun/article/details/68946343 也可以调用专门为lua调用而封装的C库。 具体步骤: 1.原C文件中引入lua相关头文件 #include "lua.h" #include "lualib.h" #include "lauxlib.h"2.声明

九日王朝 7038

智慧方案智慧酒店智能弱电系统解决方案(92页PPT).pptx

智慧方案智慧酒店智能弱电系统解决方案(92页PPT).pptx

上一篇: lua学习(四)
下一篇: luasql扩展
flashvan
博客等级 码龄22年 6粉丝 67原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值