zoukankan      html  css  js  c++  java
  • 函数堆栈C++中调用lua脚本文件

    近期一直在查找函数堆栈之类的问题,今天正好有机会和大家共享一下.

        想要在C++中用调lua脚本文件中的函数比较简略,因为lua脚本是通过堆栈来和C\C++来停止据数互交的,
    所以理原也很简略,只要需先把lua脚本的函数压入到堆栈中
    接着再把这个函数所要需的参数也以从左到右的次序压入到堆栈中,
    然后就能够执行这个函数了
    函数执行后,就会动自删除刚才被我们压入到堆栈中的据数,然后将函数的返回值压入到堆栈
    理原就这样,不过就是通过堆栈来停止据数互交
     
    先来看一段小序程:
    这段序程将演示如何从lua脚本文件中用调全局量变

    void main()
    {
    lua_State* pluaState=luaL_newstate();
    luaL_openlibs(pluaState);
    //执行Lua脚本
    luaL_dofile(pluaState,"../Script/test.lua");
     
    //将脚本文件中的Pi量变压入堆寨
    lua_getglobal(pluaState,"Pi");
    cout<<"读取lua脚本的Pi量变:"<<(float)lua_tonumber(pluaState,1)<<endl;
    lua_pop(pluaState,1);
     
    //释放资源
    lua_close(pluaState);
    getchar();
    }

        ---------------------------------------------------------以下是lua脚本文件-------------------------------------------------------------------------------
    --就只有一行代码,定义了一个全局量变pi
    Pi=3.1415926

        面上这段序程加粗部份的地方就是现实这个功能的代码
    函数lua_getglobal()是用来将lua脚本文件中的全局量变压入到堆栈中,这个函数有两个参数,第一个参数是lua的状态机(于用存储据数),
    第二个参数是你想获得的全局量变的名称标识符..

        函数lua_tonumber()是读取堆栈指定位置的据数并且转换为数值型,这个函数的第一个参数是lua的状态机,第二个参数是要读取的据数的位置
    最后我们将读取出来的据数接着转换为浮点型据数,通过cout打印到控制台..

        最后一个函数lua_pop()无关紧要,但是为了当前便方续继和lua堆栈中的据数停止互交作操,最好还是用调一下这个函数..
    这个函数的功能是删除堆栈中指定位置的据数

        每日一道理
    爱,有的时候不要需山盟海誓的承诺,但她一定要需细致入微的关怀与问候;爱,有的时候不要需梁祝化蝶的悲壮,但她一定要需心有灵犀的默契与投合;爱,有的时候不要需雄飞雌从的追随,但她一定要需相濡以沫的支持与理解。

        用调lua脚本中的函数和用调lua脚本文件中的全局量变相似,少至理原一样,但稍有不同
    用以下代码替换之前黑体字部份的代码,其余变不

    //用调lua脚本中的函数
    lua_getglobal(pluaState,"Add");   
    lua_pushnumber(pluaState,1);
    lua_pushnumber(pluaState,1);
    lua_call(pluaState,2,1);
    cout<<"1+1="<<(int)lua_tonumber(pluaState,1)<<endl;
    lua_pop(pluaState,1);

        
    -----------------------------------------------------------以下是脚本文件-----------------------------------------------------------
    --函数,这个函数分十简略,就是现实加法算运,返回两个数相加的结果
    function Add(intX,intY)
    return intX+intY;
    end-----------------------------------------------------------以下是脚本文件-----------------------------------------------------------

        以上这段C++序程:
    lua_getglobal(pluaState,"Add");这个函数将lua脚本中的Add()函数压入堆栈中
    lua_pushnumber(pluaState,1);这个函数将指定的数值型据数压入到堆栈中
    lua_pushnumber(pluaState,1);同上
    lua_call(pluaState,2,1);执行刚才被压入堆栈中的函数,这个函数最后两个参数分别是参数的数量和返回值的数量
    函数执行后会删除本来被压入到堆栈中的据数,接着会把返回值压入到堆栈
    cout<<"1+1="<<(int)lua_tonumber(pluaState,1)<<endl;
    lua_pop(pluaState,1);
    以上这两段代码就是现将堆栈中的返回值出输,然后将他删除,,便方当前续继和lua堆栈停止据数互交

        
     

    文章结束给大家分享下程序员的一些笑话语录: 真正的程序员喜欢兼卖爆米花,他们利用CPU散发出的热量做爆米花,可以根据米花爆裂的速度听出正在运行什么程序。

  • 相关阅读:
    蓝桥杯--算法训练 区间k大数查询
    vijos1782:借教室
    vijos1779国王游戏
    C++大数模板
    HDU1042(N!:设4为基数)
    HDU1026(延时迷宫:BFS+优先队列)
    POJ3984(迷宫问题)
    HDU3018:Ant Trip(欧拉回路)
    HDU5438:Ponds(拓扑排序)
    2008北航:字符串匹配
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3043293.html
Copyright © 2011-2022 走看看