zoukankan      html  css  js  c++  java
  • (使用lua++)Lua脚本和C++交互(四)

    上一篇中,你已经可以在Lua里面用C++的函数了,那么咱们再增加一点难度,比如,我有一个CTest对象,要作为一个参数,传输给func_Add()执行,怎么办?
    很简单,如果你对上面的代码仔细阅读,你会发现下面的代码一样简洁。为了支持刚才要说的需求,我们需要把Sample.lua再做一点修改。

    function func_Add(x, y, f)
      -- New了一个CTest对象,并进行赋值操作,最后把结果打印在屏幕上
          
      -- local test = CTest:new()  
      -- test:SetData("I'm xiaotian")  
      -- test:GetData()  
    
      f:SetData("I'm xiaotian")  
      f:GetData() 
    
      return x..y;  
    end 

    假设就是我们要传入的CTest对象。我们要在Lua里面使用它。(我们的CLuaFn都不用改,把main函数稍微改一下即可,来看看怎么写。)

    #include "CLuaFn.h"
    int main(int argc, char* argv[])
    {  
        CLuaFn CLuaFn;  
        CLuaFn.Init();
        CLuaFn.InitClass();  
        CLuaFn.LoadLuaFile("Sample.lua");  
        CParamGroup ParamIn;  
        CParamGroup ParamOut;  
        char szData1[20] = {''};
    
        sprintf(szData1, "[yang]");  
        _ParamData* pParam1 = new _ParamData(szData1, "string", (int)strlen(szData1));  
        ParamIn.Push(pParam1);  
    
        char szData2[20] = {''};  
        sprintf(szData2, "[xiaotian]");  
        _ParamData* pParam2 = new _ParamData(szData2, "string", (int)strlen(szData2));  
        ParamIn.Push(pParam2);  
    
        //只追加了这里  
        CTest* pTest = new CTest();  
        _ParamData* pParam3 = new _ParamData(pTest, "CTest", sizeof(CTest));  
        ParamIn.Push(pParam3);  
        //追加结束 
      
        char szData4[40] = {''};  
        _ParamData* pParam4 = new _ParamData(szData4, "string", 40);  
        ParamOut.Push(pParam4);
    
        CLuaFn.CallFileFn("func_Add", ParamIn, ParamOut);  
        char* pData = (char* )ParamOut.GetParam(0)->GetParam();  
        printf("[Main]Sum = %s.
    ", pData);  
        getchar();  
        return 0;  
    }

    运行看看输出结果:

    既然已经到了这里,我们索性再加点难度,如果我要把CTest作为一个对象返回回来怎么做?很简单,且看。(运行中断,问题待解决)

    #include "CLuaFn.h"
    int main(int argc, char* argv[])
    {  
        CLuaFn CLuaFn;  
        CLuaFn.Init();
        CLuaFn.InitClass();  
        CLuaFn.LoadLuaFile("Sample.lua");  
        CParamGroup ParamIn;  
        CParamGroup ParamOut;  
        char szData1[20] = {''};
    
        sprintf(szData1, "[yang]");  
        _ParamData* pParam1 = new _ParamData(szData1, "string", (int)strlen(szData1));  
        ParamIn.Push(pParam1);  
    
        char szData2[20] = {''};  
        sprintf(szData2, "[xiaotian]");  
        _ParamData* pParam2 = new _ParamData(szData2, "string", (int)strlen(szData2));  
        ParamIn.Push(pParam2);  
    
        //只追加了这里  
        CTest* pTest = new CTest();  
        _ParamData* pParam3 = new _ParamData(pTest, "CTest", sizeof(CTest));  
        ParamIn.Push(pParam3);  
        //追加结束 
    
        //char szData4[40] = {''};  
        //_ParamData* pParam4 = new _ParamData(szData4, "string", 40);  
        CTest* pTestRsult = NULL;
        _ParamData* pParam4 = new _ParamData(pTestRsult, "CTest", sizeof(CTest)); 
        ParamOut.Push(pParam4);
    
        CLuaFn.CallFileFn("func_Add", ParamIn, ParamOut);  
    
        //char* pData = (char* )ParamOut.GetParam(0)->GetParam();  
        //printf("[Main]Sum = %s.
    ", pData);  
    
        //接受Lua返回参数为CTest类型,并调用其中的方法  
        pTestRsult = (CTest* )ParamOut.GetParam(0)->GetParam(); 
        pTestRsult->GetData(); 
    
        getchar();  
        return 0;  
    }
  • 相关阅读:
    归并排序(Merge Sort)
    AtCoder AGC035D Add and Remove (状压DP)
    AtCoder AGC034D Manhattan Max Matching (费用流)
    AtCoder AGC033F Adding Edges (图论)
    AtCoder AGC031F Walk on Graph (图论、数论)
    AtCoder AGC031E Snuke the Phantom Thief (费用流)
    AtCoder AGC029F Construction of a Tree (二分图匹配)
    AtCoder AGC029E Wandering TKHS
    AtCoder AGC039F Min Product Sum (容斥原理、组合计数、DP)
    AtCoder AGC035E Develop (DP、图论、计数)
  • 原文地址:https://www.cnblogs.com/yyxt/p/4022766.html
Copyright © 2011-2022 走看看