最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 在C++使用LUA交互,LUA实现闭包,C++/LUA相互闭包

    LUA可谓是配置文件神器,具体功能用过才知道,接近两年没用了抽了俩小时熟习了下基本的用法。

    包括C/LUA堆栈操作 函数相互调用 和LUA的闭包 C++和LUA相互闭包

    想要灵活使用LUA必须先要学习 LUA和C的堆栈交互模型 类似于汇编函数调用方式了 很成心思。

    要学习LUA首先要理解LUA和C/C++交互的堆栈lua_State  这里援用网友的1篇文章很详细

    http://wind-catalpa.blog.163.com/blog/static/1147535432013119103150929/

    上代码

    C++代码

    <span style="font-size:14px;color:#000000;">#include "string.h"
    extern "C"
    {

    #include "lualib.h" //包括lua lib
    #include "lauxlib.h" //辅助函数
    };
    #pragma comment(lib,"lua.lib")
    //Lua和C程序通过1个堆栈交换数据: lua_State
    lua_State* GetLua()
    {
    lua_State* lu = luaL_newstate(); /*创建Lua对象*/
    luaL_openlibs(lu); // 打开所有 同享库函数 到lua 对象
    return lu ;
    }

    //批量数据压入堆栈
    #define FOR_PUSH(I,J,STEP,LUA)
    for(int i=I;i<=J;i+=STEP)
    {
    lua_pushinteger(LUA,i);
    }
    //取出堆栈中指定index的数据
    //打印堆栈数据
    #define FOR_LIST(I,J,STEP,LUA)
    for(int i=I;i<=J;i+=STEP)
    {
    int n=lua_tointeger(LUA,i);
    printf("堆栈中Index:%d,数据:%d
    ",i,n);
    }

    #define CLEAR(LUA)
    for(int i=1;i<=lua_gettop(LUA);i++)
    lua_pop(LUA,i)

    //返回1个结果
    //函数原型具体参照LUA5.2文档
    int callCPP(lua_State *lua)
    {
    int a = lua_tointeger(lua, 1);
    int b = lua_tointeger(lua, 2);
    lua_pushnumber(lua, a+b); //结果压栈
    return 1;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
    //获得C和Lua交互的堆栈指针
    lua_State *lua =GetLua();
    if(lua==nullptr)
    {
    printf("Lua Open Error");
    return 0;
    }
    //关于Lua的堆栈操作
    FOR_PUSH(1,10,1,lua);//循环顺序入堆栈的参数
    int n=lua_gettop(lua);
    printf("lua堆栈中有%d个参数
    ",n);
    FOR_LIST(1,10,1,lua); //
    //lua_pop(lua,3) ;//依照堆栈 落后先出的方式弹出3个参数
    n=lua_gettop(lua);
    printf("lua堆栈中有%d个参数
    ",n);
    FOR_LIST(1,n,1,lua); //
    //履行简单内存LUA脚本
    char*pLua="print ("hello,lua!")";
    luaL_loadbuffer(lua,pLua,strlen(pLua),"testLuaScript0Chunk");
    if(LUA_OK==lua_pcall(lua, 0,0,0))
    {
    printf("lua 脚本调用成功!
    ");
    }
    //弹出堆栈所有数据
    CLEAR(lua);

    ///加载lua脚本 并且编译运行lua脚本
    //从当前工作目录加载
    if(luaL_dofile(lua,"./c.lua"))
    {
    printf("lua脚本加载成功!
    ");
    }
    lua_getglobal(lua,"num1");//加载到堆栈
    lua_getglobal(lua,"num2");//加载到堆栈
    lua_getglobal(lua,"str1"); //加载字符串
    int num1 = lua_tointeger(lua, ⑶); //逆向取值 从堆栈 LUA堆栈为双向
    printf("num1:%d
    ",num1);
    n=lua_gettop(lua);
    int num2 = lua_tointeger(lua, ⑵); //逆向取值 从堆栈 LUA堆栈为双向
    printf("num2:%d
    ",num2);
    n=lua_gettop(lua);
    printf("lua堆栈中有%d个参数
    ",n);
    CLEAR(lua);
    //加载函数到堆栈
    //调用的是无参函数
    lua_getglobal(lua,"testHello") ;
    n=lua_gettop(lua);
    printf("lua堆栈中有%d个参数
    ",n);
    //lua 函数调用会自动清算堆栈
    lua_pcall(lua, 0,0,0);
    n=lua_gettop(lua);
    printf("lua堆栈中有%d个参数
    ",n);

    lua_getglobal(lua,"Closer") ; //函数压入栈顶
    lua_pushinteger(lua,1);
    lua_pushinteger(lua,2);//压入参数
    //闭包函数调用
    if(LUA_OK!=lua_pcall(lua,2,1,0))
    {
    printf("函数调用失败!
    ");
    return 0 ;
    }

    int result=lua_tointeger(lua,⑴);//取出栈顶数据
    printf("Closer result:%d
    ",result);
    //注意清算堆栈返回值在 栈顶 POP1下
    lua_pop(lua,1);
    n=lua_gettop(lua);
    printf("lua堆栈中有%d个参数
    ",n);
    /////LUA调用C++函数
    //注册函数
    lua_register(lua, "CallC", callCPP);
    //从当前工作目录加载
    if(luaL_dofile(lua,"./c1.lua"))
    {
    printf("lua c1脚本加载成功!
    ");
    }
    ///C/LUA闭包调用
    lua_pushcfunction(lua,callCPP);
    lua_setglobal(lua,"CallCT");//设置lua中的调用
    lua_getglobal(lua,"CloserT");//加载lua闭包函数到C++堆栈
    lua_pushinteger(lua,2); //函数堆栈参数1定要正确
    lua_pushinteger(lua,3);
    lua_pcall(lua,2,0,0);
    n=lua_gettop(lua);
    printf("lua堆栈中有%d个参数
    ",n);

    return 0;
    }

    </span>

    c.lua 和c1.lua文件

    –c.lua

    str1="hello,I am Luaer"
    num1=2
    num2=3
    –测试函数输出 str1
    function testHello()
    print(str1)
    end
    –lua实现闭包
    function Closer(i,j)
    function add(i,j)
    return i+j
    end
    return add(i,j)
    end

    function CallC(a,b)
    return callCPP(a,b)
    end

    –c1.lua call C++ function
    num=CallC(3,4)
    print ("num is:",num)
    –c++和lua相互闭包
    function CloserT(a,b)
    num1=CallCT(a,b)
    print ("C++/LUA相互闭包 Num1 is:",num1)
    end


    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » 在C++使用LUA交互,LUA实现闭包,C++/LUA相互闭包

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级