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

手写Socket Web服务器:深入HTTP协议底层原理

HTTP协议是Web通信的基石,其本质是一套严格定义的文本格式与状态交互规范。理解它需回归传输层——TCP连接建立、请求响应格式(如状态行、头/体分隔符\r\n\r\n)、字符编码与字节长度一致性等核心原理。这些知识直接决定CORS拦截、中文乱码、Content-Length错误等高频问题的排查效率。在现代框架封装日益厚重的今天,亲手用Socket实现一个可被Chrome识别的极简Web服务器,成为掌握Web运行机制最有效的实践路径。本文即以DebugLZQ经典案例为蓝本,还原从URI解析、DNS查询、So

weixin_40192258的博客 534

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

机房电脑的“还原”秘密:如何应对重启即清零的困境

机房电脑重启后自动还原是常见的现象,这主要依靠硬件还原卡或软件还原系统(如冰点还原)实现。这类技术会定期将系统盘恢复初始状态,但通常不保护非系统盘。要高效使用公共电脑,建议:1)将个人文件存储在D/E盘;2)使用绿色便携软件;3)必要时可尝试通过热键临时关闭还原功能;4)养成云端备份习惯。掌握这些技巧既能遵守机房规定,又能保证学习资料安全,培养良好的数字资产管理能力。

一位主要以学校学生信息技术,社会工作生活讲解科普拓展的博主 1451

钉钉开发(三)——Java推送钉钉待办任务

之前一篇博文中,讲解了如何推送钉钉群消息,感兴趣的可以点击查看。 钉钉开发(一)——Java给钉钉群推送消息

Monten_Cristo的博客 6410

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

音视频从入门到精通——指数哥伦布码原理

在计算机中,一般数字的编码都为二进制,但是由于以相等长度来记录不同数字,因此会出现很多的。

mirana的专栏 1381

Lua 基础之与 C 交互

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

xingxinmanong的博客 683

YOLO11涨点优化:loss优化 | 一种新的基于Wasserstein距离的小目标检测评估方法,助力小目标涨点

提出了一种新的基于Wasserstein距离的小目标检测评估方法,通过它们对应的高斯分布计算它们之间的相似性

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1016

Android16 动态隐藏systemUI右侧音量条

本文介绍了如何屏蔽SystemUI系统音量条并显示自定义音量控制条的实现方法。主要通过两个步骤:1)在编译脚本中定义控制属性persist.rp.show.volume.dialog=off来隐藏系统音量条;2)修改SystemUI源码中的VolumeDialogImpl.java文件,在showH方法中根据属性值判断是否显示系统音量条。当属性值为off时直接return,从而屏蔽系统音量条的显示,实现自定义音量控制条的替代显示。该方法通过系统属性控制显示状态,具有灵活可控的特点。

tzj1058756809的博客 779

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

科研项目数据抓取:Python爬虫实现与分析

本文详细介绍了如何使用Python爬虫抓取科研项目的数据,涵盖了从目标数据源选择到数据存储与分析的整个过程。通过使用。

2201_76125261的博客 1710

[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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

lua与c交互

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

梁平平的博客 623

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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、付费专栏及课程。

余额充值