zoukankan      html  css  js  c++  java
  • lua和C++的交互(1)

    /*
    以前听的一个故事,当年Java的创造者讲课的时候,一开始先拿一个简单的不能简单的小例子,
    不断的扩展,最后成为一个复杂而完美的程序。
    一个重要之重要的概念,就是栈。Lua与别的语言交互以及交换数据,是通过栈完成的。
    */
    #include <iostream>
    using namespace std;
    
    extern "C"   //这部分按C语言进行编译而不是C++
    {
        #include "lua.h"
        #include "lualib.h"
        #include "lauxlib.h"
    }
    
    class CLuaFn
    {
    public:
        CLuaFn(void);
        ~CLuaFn(void);
        
        void Init();    //初始化Lua对象指针参数
        void Close();   //关闭Lua对象指针
    
        bool LoadLuaFile(const char* pFileName);                                 //加载指定的Lua文件
        bool CallFileFn(const char* pFunctionName, int nParam1, int nParam2);    //执行指定Lua文件中的函数
    
    private:
        lua_State* m_pState;  //这个是Lua的State对象指针,一个lua文件对应一个
    };
    
    void CLuaFn::Init()
    {
        if(NULL == m_pState)
        {
            m_pState = lua_open();   //返回一个lua对象指针
            luaL_openlibs(m_pState); //加载所有可能用到的Lua基本库,比如加载lua的string库,io库,math库等等等等
        }
    }
    
    void CLuaFn:Close()
    {
        if(NULL != m_pState)
        {
            lua_close(m_pState);   //关闭lua对象并释放指针
            m_pState = NULL;      
        }
    }
    
    /*
    加载指定的Lua文件
    这里要特别说明一下,因为Lua是脚本语言,加载lua文件本身的时候才会编译
    所以在加载文件的时候尽量放在程序的初始化中,因为当你执行luaL_dofile()函数的时候,
    Lua会启用语法分析器,去分析你的脚本语法是否符合Lua规则,如果你胡乱的传一个文件过去,
    Lua就会告诉你文件语法错误,无法加载。如果你的Lua脚本很大,函数很多,语法分析器会比较耗时,
    所以,加载的时候,尽量放在合适的地方,而且,对于一个Lua文件而言,
    反复加载luaL_dofile()除了会使你的CPU变热没有任何意义
    */
    bool CLuaFn:LoadLuaFile(const char* pFileName)
    {
        int nRet = 0;
        if(m_pState == NULL)
        {
            return false;
        }
        nRet = luaL_dofile(m_pState, pFileName);
        if(nRet != 0)
        {
            //lua_tostring(m_pState,-1)-1取m_pState栈顶数据,即错误提示字符串 (-1相对栈顶位置,1相对栈底的绝对位置)
            printf("CLuaFn::LoadLuaFile(%s) is file(%d)(%s)
    ", pFileName, nRet, lua_tostring(m_pState,-1));
            return false;
        }
    
        return true;
    }
    
    //执行指定Lua文件中的函数
    bool CLuaFn:CallFileFn(const char*pFunctionName, int nParam1, int nParam2)
    {
        int nRet = 0;
        if(m_pState == NULL)
        {
            return false;
        }
        lua_getglobal(m_pState, pFunctionName); //验证Lua函数是否在当前加载的Lua文件中,并把指针指向这个函数位置
        lua_pushnumber(m_pState, nParam1);      //压栈操作,把数据压入数据栈
        lua_pushnumber(m_pState, nParam2);
    }
  • 相关阅读:
    CF 526F Max Mex(倍增求LCA+线段树路径合并)
    CoderForces Round526 (A~E)题解
    牛客OI周赛4-提高组 A K小生成树(kmst)
    Codeforces 1072 C
    Codeforces 1053 C
    牛客国庆集训派对Day3 B Tree
    牛客国庆集训派对Day3 I Metropolis
    牛客国庆集训派对Day3 A Knight
    牛客国庆集训派对Day3 G Stones
    Codeforces 1053 B
  • 原文地址:https://www.cnblogs.com/kane0526/p/7798203.html
Copyright © 2011-2022 走看看