侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

lua 基础教程

技术  /  管理员 发布于 6年前   318

最近在看lua,觉得很有趣,发现没有最新版本的例子,所以自己就别人的博客里弄了源码,然后改成最新版本的lua C API.

关于lua非常基础的就不介绍了,咱们就从简单的测试开始吧。

在此之前如果没有搭好lua在win32下的环境,请看 ///article/61451.htm

1.C/C++执行lua脚本

我只是用改用了最新的lua的C API。不多说,直接上代码

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;int main(){lua_State *pLuaState = luaL_newstate();/*载入lua基本库*/luaL_openlibs(pLuaState);//luaopen_base(pLuaState);//luaopen_io(pLuaState);        //替换老版本的lua_iolibopen(pLuaState);//luaopen_string(pLuaState);      //替换老版本的lua_strlibopen(pLuaState);//luaopen_math(pLuaState);     //替换老版本的lua_mathlibopen(pLuaState);//luaopen_debug(pLuaState);     //替换老版本的lua_dblibopen(pLuaState);/*运行脚本*/luaL_dofile(pLuaState,"./script/hw.lua");/*清除lua*/ lua_close(pLuaState);/*暂停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}

hw.lua的源码:

print("Hello Word!");

这个例子只是简单的执行了一个lua脚本。

其中:lua_newstate是核心函数,要求提供内存分配函数,luaL_newstate是辅助库函数,采用默认的内存分配函数。lua_open是5.0时代的产物,5.1是luaL_newstate的宏,5.2里面已经没有了。

2.C/C++调用lua函数

话不多说,直接上代码

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;/************************************************************************///函数功能:调用lua函数//函数参数://     L lua虚拟机//     x//     y//函数返回://     sum//核心函数 lua_call()/*调用一个函数。要调用一个函数请遵循以下协议: 首先,要调用的函数应该被压入堆栈; 接着,把需要传递给这个函数的参数按正序压栈;这是指第一个参数首先压栈。 最后调用一下 lua_call; nargs 是你压入堆栈的参数个数。 当函数调用完毕后,所有的参数以及函数本身都会出栈。而函数的返回值这时则被压入堆栈。 返回值的个数将被调整为 nresults 个, 除非 nresults 被设置成 LUA_MULTRET。在这种情况下,所有的返回值都被压入堆栈中。 Lua 会保证返回值都放入栈空间中。函数返回值将按正序压栈(第一个返回值首先压栈), 因此在调用结束后,最后一个返回值将被放在栈顶。被调用函数内发生的错误将(通过 longjmp)一直上抛。*//************************************************************************/int luaadd(lua_State *L, int x, int y){int sum;/*通过名字获取Lua函数*/lua_getglobal(L,"add");/*向栈中压入第一个参数*/lua_pushnumber(L,x);/*向栈中压入第二个参数*/lua_pushnumber(L,y);/*调用函数*/lua_call(L,2,1);/*得到结果把给定索引处的 Lua 值转换为 lua_Integer 这样一个有符号整数类型。这个 Lua 值必须是一个数字或是一个可以转换为数字的字符串,否则,lua_tointeger 返回 0 。*/sum = (int)lua_tointeger(L,-1);/*从堆栈中弹出 n 个元素*///nlua_pop(L,1);return sum;}int main(){int sum;/*初始化lua虚拟机*/lua_State *L = luaL_newstate();/*载入lua基本库*/luaL_openlibs(L);/*载入脚本*/luaL_dofile(L,"./script/test.lua");/*调用lua函数*/sum = luaadd(L,10,15);/*显示结果*/cout<<"The sum = "<<sum<<endl;/*清除lua虚拟机*/lua_close(L);/*显示结果并暂停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}

test.lua代码为:

function add(x,y)return x + y;end

其中关于lua的堆栈问题,目前我还没有了解,希望大家多多指教。

3.lua调用C/C++函数

代码为:

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;static int average(lua_State *L){/*得到参数个数*/int n = lua_gettop(L);/*定义和*/double sum = 0;/*循环变量*/int i;/*循环取值求和*/for (i = 1; i <= n; i++){sum += lua_tonumber(L,i);//cout<<sum<<endl;}//cout<<"fffffff"<<endl;/*压入平均值*/lua_pushnumber(L,sum/n);/*压入和*/lua_pushnumber(L,sum);/*返回返回值个数*/return 2;}int main(){/*初始化Lua虚拟机*/lua_State *L = luaL_newstate();/*打开lua基本库*/luaL_openlibs(L);/*注册函数*/lua_register(L,"average",average);/*运行脚本*/luaL_dofile(L,"./script/avg.lua");/*清除lua虚拟机*/lua_close(L);/*打印暂停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}

avg.lua源码为:

function main()local avg,sum = average(2,2,2,2,2);print("The avg is",avg);print("The sum is", sum);endmain();


  • 上一条:
    Perl中的真与假深入研究
    下一条:
    perl use 命令中指定路径的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客