加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

在C++使用LUA交互,LUA实现闭包,C++/LUA相互闭包

发布时间:2020-12-13 20:21:37 所属栏目:PHP教程 来源:网络整理
导读:LUA可谓是配置文件神器,具体功能用过才知道,接近两年没用了抽了俩小时熟习了下基本的用法。 包括C/LUA堆栈操作函数相互调用和LUA的闭包 C和LUA相互闭包 想要灵活使用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,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,lua); // //lua_pop(lua,3) ;//依照堆栈 落后先出的方式弹出3个参数 n=lua_gettop(lua); printf("lua堆栈中有%d个参数 ",n,lua); // //履行简单内存LUA脚本 char*pLua="print ("hello,lua!")"; luaL_loadbuffer(lua,pLua,strlen(pLua),"testLuaScript0Chunk"); if(LUA_OK==lua_pcall(lua,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); 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,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,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





(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读