• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    lua 基础教程

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

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

    在此之前如果没有搭好lua在win32下的环境,请看 https://www.jb51.net/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 个元素*/
    //n
    lua_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 = "sumendl;
    /*清除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);
    //coutsumendl;
    }
    //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);
    end
    main();
    

    您可能感兴趣的文章:
    • Lua基础教程之表(Table)学习笔记
    • Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
    • 在Lua中使用模块的基础教程
    上一篇:Lua调用自定义C模块
    下一篇:lua日志文件处理代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    lua 基础教程 lua,基础,教程,lua,基础,教程,