• 函数堆栈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散发出的热量做爆米花,可以根据米花爆裂的速度听出正在运行什么程序。

  • 相关阅读:
    Aurora 数据库支持多达五个跨区域只读副本
    Amazon RDS 的 Oracle 只读副本
    Amazon EC2 密钥对
    DynamoDB 读取请求单位和写入请求单位
    使用 EBS 优化的实例或 10 Gb 网络实例
    启动 LAMP 堆栈 Web 应用程序
    AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff in AWS
    使用 Amazon S3 阻止公有访问
    路由表 Router Table
    使用MySQLAdmin工具查看QPS
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3043293.html
Copyright © 2020-2023  润新知