Lua 与C交互

lua 调用 C Lua中调用C函数(lua-5.2.3) 由sf0501创建,小路依依 最后一次修改2016-11-16 Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性。 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数。 对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef in... 阅读详情
             Lua和C之间的交互

(一) Lua 调C函数

  1.    什么样类型的函数可以被Lua调用
    
typedef int (*lua_CFunction) (lua_State *L);
  1.    符合类型的函数怎样处理后才可以被Lua调用
    

使用lua_register或者 lua_pushfunction和lua_setglobal()把要调用的函数加入到lua状态机中。

#define lua_register(L,n,f) /
            (lua_pushcfunction(L, f), lua_setglobal(L, n))

lua_register的第二个参数就是Lua脚本中对这个函数的调用名称。

举例:

如果C函数名称是foo,使用lua_registe注册(L,”acfoo”,foo),那么在Lua脚本中使用acfoo来表示使用foo函数.

  1.    Lua 如何调用c函数
    

简单,使用注册的名称直接调用

  1.    如何传递参数和计算结果
    

① 使用堆栈交互

引用使用手册上的一段话:

Lua 使用一个虚拟栈来和 C 传递值。栈上的的每个元素都是一个 Lua 值(nil,数字,字符串,等等)。

无论何时 Lua 调用 C,被调用的函数都得到一个新的栈,这个栈独立于 C 函数本身的堆栈,也独立于以前的栈。(在 C 函数里,用 Lua API 不能访问到 Lua 状态机中本次调用之外的堆栈中的数据),它里面包含了 Lua 传递给 C 函数的所有参数,而 C 函数则把要返回的结果也放入堆栈以返回给调用者。

方便起见,所有针对栈的 API 查询操作都不严格遵循栈的操作规则。而是可以用一个索引来指向栈上的任何元素:正的索引指的是栈上的绝对位置(从一开始);负的索引则指从栈顶开始的偏移量。更详细的说明一下,如果堆栈有 n 个元素,那么索引 1 表示第一个元素(也就是最先被压入堆栈的元素)而索引 n 则指最后一个元素;索引 -1 也是指最后一个元素(即栈顶的元素),索引 -n 是指第一个元素。如果索引在 1 到栈顶之间(也就是,1 ≤ abs(index) ≤ top)我们就说这是个有效的索引。

② 从Lua脚本中获取参数

int n = lua_gettop(L);
/* get each argument */
lua_tostring(lua_State *L, int index)
     …….

 index: 1—左边第一个参数,2—左边第二个参数,......

③ 返回返回值

 按顺序返回,Lua按照返回顺序接受

 Lua_pushXXX(L,第一个返回值)

 Lua_pushXXX(L,第二个返回值)

 ………

Lua调用C函数例子:

C程序:

static int average(lua_State *L)

{

    /* get number of arguments */

    int n = lua_gettop(L);

    double sum = 0;

    int i;

 

    /* loop through each argument */

    for (i = 1; i <= n; i++)

    {

        if (!lua_isnumber(L, i))

        {

            lua_pushstring(L, "Incorrect argument to 'average'");

            lua_error(L);

        }

 

        /* total the arguments */

        sum += lua_tonumber(L, i);

    }

 

    /* push the average */

    lua_pushnumber(L, sum / n); //第一个返回值

 

    /* push the sum */

    lua_pushnumber(L, sum); //第二个返回值

 

    /* return the number of results */

    return 2;

}

 

void LuaCallC()

{

    /* initialize Lua */

    lua_State * L = lua_open();

 

    /* load Lua base libraries */

    luaL_openlibs(L);

 

    /* register our function */

    lua_register(L, "average", average);

 

    /* run the script */

    luaL_dofile(L, "average.lua");

 

    /* cleanup Lua */

    lua_close(L);

     

}

 

Lua脚本,average.lua:

avg, sum = average(20,40,50,60,80)

print("The average is ", avg)

print("The sum is ", sum)

(二) Lua 从C库中调用

  1.    生成C函数库
    

① 所有可以被Lua调用的函数必须是lua_CFunction类型

② 所有被调用的函数加入到一个luaL_reg数组中

③ 一个luaopen_*(*表示库的名称)供lu调用库时打开库

使用luaL_register(lua_State *L,

                const char *libname,

                const luaL_Reg *l)

libname,注册lua使用这个库时的使用名称

luaL_Reg *l,把luaL_Reg数组里的函数注册到lua栈里,供lua调用

注意:BCB默认导出的c函数前面加了下划线,因此在动态库工程中加入一个def文件,在生成时不用加下划线。内容是:

Export

   FunName = _FunName (FunName表示要导出的函数名称,Lua使用的库中就是luaopen_*)
  1.    Lua使用c库
    

require(libname) – 打开使用的库

libname.FunName – 使用c库中提供的函数

Lua调用C函数库例子:

C库代码,C函数的名称”dllforlua.dll”

static int lua_msgbox(lua_State* L)

{

    const char* message = luaL_checkstring(L, 1);

    const char* caption = luaL_optstring(L, 2, "");

    int result = MessageBox(NULL, message, caption, MB_YESNO);

    lua_pushnumber(L, result);

    return 1;

}

static const  luaL_Reg mylib[] =

{

    {"msgbox", lua_msgbox},

    {NULL, NULL}

};

int __declspec(dllexport)  luaopen_dllforlua(lua_State* L)

{

    luaL_register(L, "dllforlua", mylib);

    return 1;

}

Lua脚本,Test.lua

require(“dllforlu”)

dllforlua.msgbox("Hey, it worked!", "Lua Message Box");

 

(三) C调Lua 函数

  1.    初始化Lua环境
    

Lua_open或者:lua_newstate

         luaL_newstate(调用lua_newstate,并且设置了一个恐慌函数)
  1.    加载Lua标准库
    

Lua_openlibs(打开所有标准库)

不打开所有库,打开需要的库:

   Luaopen_base

   luaopen_package

   luaopen_string

   luaopen_table

   luaopen_math


  1.    加载Lua和函数函数
    
luaL_dofile()

lua_getglobal()

大小写敏感,名字于Lua脚本的函数名称大小写完全一致

  1.    压入参数
    

    不同类型采用不同的函数,按照从左往右的顺序依次压栈

 lua_pushnumber,lua_pushstring,…..
  1.    执行函数
    
lua_call, lua_pcall
  1.    获取返回值
    

不同类型使用不同的函数,注意索引,获取前要检查类型

  1.    从栈中弹出返回值
    
 lua_pop()
  1.    关闭Lua状态机
    
lua_close()

C程序掉用Lua函数例子:

C函数:

void CCallLua()

{

    // Create a LUA VMachine

    lua_State *L;

    //L = luaL_newstate();

    L = lua_open();

 

    //Load Libraries

    luaL_openlibs(L);

 

     // 运行脚本 /

    luaL_dofile(L, "clua.lua");

    lua_getglobal(L,"Sum");

 

    lua_pushnumber(L,2);//第一个参数

    lua_pushnumber(L,3);//第二个参数

    lua_pushnumber(L,4);//第三个参数

 

    lua_pcall(L,3,2,0);

 

    double sum=0,ave=0;

    if(lua_isnumber(L,1))

    {

        sum=lua_tonumber(L,1);

    }

    if(lua_isnumber(L,2))

    {

        ave=lua_tonumber(L,2);

    }

 

    lua_pop(L,2);

 

    cout<<"Sum ="<<sum

        <<"/nAve ="<<ave<<endl;

    // 清除Lua

    lua_close(L);

 

    getchar();

}

Lua脚本Clua.lua:

function Sum(...)

  local s=0

  local num=0     

  for k,v in pairs{...} do

    s = s + v

       num = k

  end

  return s,s/num

end

————————————————
版权声明:本文为优快云博主「sumoyu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/sumoyu/article/details/2592693

在Lua解释器中注册自定义函数 如国这个注册的lua函数存在参数输入,在Lua中调用C函数时,所有参数都通过栈传递。在C函数中,将结果返回给Lua时,需要将结果压入栈中,并且返回结果的数量。但只是开始,我们移植lua解释器更多的是为了能让lua解释器能控制我们的硬件或者逻辑,这样lua与底层C语言的交互就尤其重要了。时间流逝、年龄增长,是自己的磨炼、对知识技术的应用,还有那不变的一颗对嵌入式热爱的心!第二个参数是lua解释器中的别名,第三个是C语言中的函数指针。这个函数返回当前栈的大小,也就是传递给函数的参数个数。 阅读详情

相关推荐

Lua与c交互原理

介绍 Lua与C交互的高级用法,进阶到高级、资深必知必会的知识点

lpl312905509的博客 1242

Lua和C语言交互入门

Lua本身的设计时就有为了可以方便的嵌入到别的语言中使用的功能,主要来说就是可以方便的嵌入到C语言中,并和C语言进行交互。这篇文章将对相关内容进行介绍。

Naisu的各种笔记 3323

Lua与宿主语言(C/C++)交互原理

Lua语言可研究的东西真是多,各种机制原理:与宿主语言(下文均指C/C++)的交互、内存管理(垃圾回收)、虚拟机实现、协程、闭包、异常捕获机制等。如取其一进行研究,要吃透还是需要点时间和精力。相信只要一点点慢慢啃,终究还是会将其吸收。 以下的相关原理介绍是基于Lua-5.1.5版本的源码,不排除与之后版本的源码中有少部分差异存在,但基本原理应该相同。

Jonny 8027

lua入门教程:第八章 C API 注册c函数

了解了栈的操作以后,为了扩展lua的功能,需要在c层上编程函数,让lua进行调用,需要把c语言函数注册到lua中。 extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" #include "luaconf.h" }; #include <string.h> using namespace std; static int average(lua_State *L) { /* get number of

haleycat的博客 1971

lua和c/c++交互

lua 和c采用虚拟栈的方式传递数据,栈中的元素是以lua 数据结构的方式存储,

Waorange的博客 1598

Lua常用C API与C/C++交互

“Lua handles a chunk as the body of an anonymous function with a variable number of arguments”这是Lua对chunk也就是lua文件的处理方式,就是认为是一个可变参数的匿名函数。也就是说,调用后栈上有一个匿名函数,这个函数的body就是文件中所有的内容。

悦分享 1213

Lua与C的交互

Lua 与 C 的交互   Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库。 C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1、  读写Lua全局变量的函数; 2、  调用Lua函数的函数; 3、  运行Lua代码片段的函数; 4、  注册C函数后可以在Lua中被调用的函数;   在C和LUA之间交互的关键在...

weixin_34377065的博客 342

手把手教你设计MTBF加速寿命试验:从阿伦尼斯模型到卡方计算(含Excel模板)

本文详细介绍了如何设计MTBF加速寿命试验,从阿伦尼斯模型到卡方计算,帮助工程师在合理时间内获得准确的MTBF数据。通过工业电源模块的实例演示,涵盖活化能确定、温度应力设计、样本量计算及数据记录规范,并提供Excel模板实现自动化计算,显著提升测试效率。

weixin_42563415的博客 540

Lua与C之间的交互

Lua与C之间的交互一、Lua与C之间的交互1.1 C调用lua函数 一、Lua与C之间的交互 1.1 C调用lua函数 代码: test.lua: function add(x, y) return x + y end test.c: #include <stdio.h> #include "lua.h" #include "lauxlib.h" #include "lualib.h" int lua_add(lua_State *L) { lua_getg

kanguolaikanguolaik的专栏 351

Cadence Virtuoso实战:NMOS差分放大器设计与SPICE仿真全解析

本文详细解析了使用Cadence Virtuoso设计NMOS差分放大器并进行SPICE仿真的全流程。从基础设计要点、原理图绘制到工作点分析与性能调优,提供了实用的设计技巧和常见问题解决方案,帮助工程师高效完成模拟集成电路设计。重点介绍了差分放大器的关键参数设置、饱和区优化及版图设计注意事项,适用于ADC、DAC等高性能电路开发。

weixin_28340315的博客 611

【数据分析生命周期全揭秘】从零开始打造你的数据科学项目 | 最全指南

在当今数据驱动的世界中,数据科学正在颠覆传统行业,成为企业决策和价值创造的重要引擎。然而,如何科学、系统地开展一个数据分析项目?这是很多人关心的核心问题。本篇文章基于经典数据分析课程内容,深入解读数据分析生命周期的每个阶段,让你快速掌握从“发现问题”到“落地应用”的完整流程。如果你正在学习或准备从事数据分析领域,这篇文章一定会对你大有帮助!数据分析生命周期的六大阶段数据分析生命周期的六个阶段相辅相成,每个阶段都至关重要:发现问题:明确需求,提出假设。数据准备:清洗、转换和可视化数据。

AI手套的博客 1739

Lua 与 C 的交互

转载:https://www.cnblogs.com/chenny7/p/3993456.html Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库。 C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1、  读写Lua全局变量的函数; 2、  调用Lua函数的函数; 3、  运行Lua代码片段的函数; 4、  注册C函...

CoderAldrich的专栏 880

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

天天酷科研的博客 243

Lua 基础之与 C 交互

lua 是一种嵌入语言,并不能独立运行,而是一个可以链接到其它应用程序的库。lua 是使用 c 语言开发的,因此它与 c 语言的交互非常简单,但 lua 作为一门十分流行的脚本语言,不仅能嵌入到语言中,还能嵌入到 java,c# 等其它语言中。lua 与 c 语言的交互方式有两种,一种是以 c 语言为主,lua 作为 c 语言调用的一个库,这种方式的 c 代码称为 应用程序代码

xingxinmanong的博客 683

康耐视visionpro-CogBlobTool工具详细说明

康耐视visionpro-CogBlobTool工具详细说明

视觉人机器视觉的博客 1726

Linux:安装Debian最新10.x操作系统(超详细)

安装Debian最新10.x操作系统安装Debian最新10.x操作系统1.下载Debian镜像2. 镜像安装引导启动页面,选择图形化安装:选择语言、时区,选中后点击continue:选择键盘模式:配置Hostname主机名,设置Root密码创建普通用户名和密码,进入磁盘分区步骤,选择“所有文件放在同一个分区”确认分区信息磁盘配置完,进入软件安装模块:选择源:进入软件包配置,等待配置结束根据需要选择软件包安装3. 安装完成重启后登录使用 安装Debian最新10.x操作系统 1.下载Debian镜像 下载D

HowieXue 薛永浩的博客 3万+

lua和C的交互

一个简单的例子struct Posint x;int y;p->x = v;return 0;p->y = v;return 0;return 1;return 1;p->y = y;p->x = x;return 1;int main()//用于创建一个新的lua虚拟机//打开标准库// 将 table 绑定到全局变量 "g_Cfuns"= LUA_OK)//关闭lua虚拟机return 0;

ZZHinclude的博客 1344

Qt C++ 串口调试助手

1. **串口配置**:支持自动检测可用串口,可配置波特率(9600~921600)、数据位(5~8)、校验位(无/奇/偶/标记/空格)、停止位(1/1.5/2)。- HEX 模式发送时,输入格式需为十六进制字符(0-9、A-F),可带空格(如 `01 A3 FF`)或不带空格(如 `01A3FF`)。// 发送模式:true=HEX,false=ASCII。// 字符串转HEX字节数组。ui->parity->addItems({"无", "奇校验", "偶校验", "标记校验", "空格校验"});

寒寒豆豆软件公司的博客 147

[Lua] Lua与C交互入门

[Lua] Lua与C交互入门 文章目录[Lua] Lua与C交互入门枚举值状态码类型码算符码比较算符码交互类型概念栈函数注释参数记号函数状态机构造和析构状态信息栈操作基本栈操作值操作建值交换函数拉取函数(Lua -> 栈)拉取函数(栈 -> C)探测函数推送函数(C -> 栈)推送函数(栈 -> Lua)算符函数调用函数lua_call(L,na,nr)调用协议 (C -> Lua)lua_pcall(L,na,nr,i)调用协议 (C -> Lua)lua_CFunc

airaou 608

从养虾到退坑:OpenClaw 卸载不留残留,一步到位

文章摘要: 本文提供OpenClaw软件的完整卸载指南,适用于Windows、macOS和Linux系统。内容包含卸载前的数据备份步骤(配置文件、日志、插件列表),以及详细的卸载脚本。Windows版通过批处理文件删除程序文件、注册表项和环境变量;macOS/Linux版则提供shell脚本,涵盖服务停止、软件包卸载、配置清理等步骤。特别强调要删除所有用户数据(包括多用户环境),确保系统无残留。文末建议重启计算机以使更改生效,实现"一步到位"的彻底卸载。

一键难忘的博客 298

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux下lua安装以及和c的交互

lua安装,与c交互的过程记录lua安装 在此我的机器环境是cenos 6.8 我安装的是lua5.1.4版本 安装lua编译的相关依赖 yum -y install readline-devel ncurses-devel tar -zxvf lua-5.1.4.tar.gz cd lua-5.1.4 make linux test make install 至此

猪会飞 2077

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

lua与c交互

Lua_State 动态结构这个结构是虚拟机运行起来最重要的结构体用 Lual_newstate 创建一个新的环境 lualib.h 定义了打开标准库的函数 Lual_openlibs 可以打开所有的标准库 创建好状态 在加载了标准库以后就能解释用户的输入了。Lua 和 c 的交互全在虚拟站里面进行。 虚拟栈解决了lia和c 的两大差异 1>lua的垃圾收集 2>c是静态类型 l

梁平平的博客 623

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

lua android 交互,lua和c之交互

xxg@xxg-desktop:~/1-wire/hellolua/src$ ./luatest--> Hello LUA, this is my first lua program for yingying!lua: average = 30C:crc8-->argument 1, Len = 12, Data = 313233343536, return 0xECC:crc8--&...

weixin_35794280的博客 584

c与lua交互 二

(一) lua 代码     --Lua的字符串模式       szMode = "(%w+)%s*=%s*(%w+)";       --要处理的字符串       szStr = "key1 = value1 key2 = value2";        --目标字符串模式       szTag = "%2";     r = string.gsub(szStr

wusthongmin的专栏 796
上一篇: lua 函数 使用 lua 函数 高级使用
下一篇: Lua中的table函数库
蛋奶酥
博客等级 码龄10年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值