日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > php教程 > 在C++使用LUA交互,LUA實(shí)現(xiàn)閉包,C++/LUA相互閉包

在C++使用LUA交互,LUA實(shí)現(xiàn)閉包,C++/LUA相互閉包

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-12-07 09:58:34 閱讀次數(shù):2667次

LUA可謂是配置文件神器,具體功能用過(guò)才知道,接近兩年沒(méi)用了抽了倆小時(shí)熟習(xí)了下基本的用法。

包括C/LUA堆棧操作 函數(shù)相互調(diào)用 和LUA的閉包 C++和LUA相互閉包

想要靈活使用LUA必須先要學(xué)習(xí) LUA和C的堆棧交互模型 類似于匯編函數(shù)調(diào)用方式了 很成心思。

要學(xué)習(xí)LUA首先要理解LUA和C/C++交互的堆棧lua_State  這里援用網(wǎng)友的1篇文章很詳細(xì)

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" //輔助函數(shù) }; #pragma comment(lib,"lua.lib") //Lua和C程序通過(guò)1個(gè)堆棧交換數(shù)據(jù): lua_State lua_State* GetLua() { lua_State* lu = luaL_newstate(); /*創(chuàng)建Lua對(duì)象*/ luaL_openlibs(lu); // 打開(kāi)所有 同享庫(kù)函數(shù) 到lua 對(duì)象 return lu ; } //批量數(shù)據(jù)壓入堆棧 #define FOR_PUSH(I,J,STEP,LUA) for(int i=I;i<=J;i+=STEP) { lua_pushinteger(LUA,i); } //取出堆棧中指定index的數(shù)據(jù) //打印堆棧數(shù)據(jù) #define FOR_LIST(I,J,STEP,LUA) for(int i=I;i<=J;i+=STEP) { int n=lua_tointeger(LUA,i); printf("堆棧中Index:%d,數(shù)據(jù):%d ",i,n); } #define CLEAR(LUA) for(int i=1;i<=lua_gettop(LUA);i++) lua_pop(LUA,i) //返回1個(gè)結(jié)果 //函數(shù)原型具體參照LUA5.2文檔 int callCPP(lua_State *lua) { int a = lua_tointeger(lua, 1); int b = lua_tointeger(lua, 2); lua_pushnumber(lua, a+b); //結(jié)果壓棧 return 1; } int _tmain(int argc, _TCHAR* argv[]) { //獲得C和Lua交互的堆棧指針 lua_State *lua =GetLua(); if(lua==nullptr) { printf("Lua Open Error"); return 0; } //關(guān)于Lua的堆棧操作 FOR_PUSH(1,10,1,lua);//循環(huán)順序入堆棧的參數(shù) int n=lua_gettop(lua); printf("lua堆棧中有%d個(gè)參數(shù) ",n); FOR_LIST(1,10,1,lua); // //lua_pop(lua,3) ;//依照堆棧 落后先出的方式彈出3個(gè)參數(shù) n=lua_gettop(lua); printf("lua堆棧中有%d個(gè)參數(shù) ",n); FOR_LIST(1,n,1,lua); // //履行簡(jiǎn)單內(nèi)存LUA腳本 char*pLua="print ("hello,lua!")"; luaL_loadbuffer(lua,pLua,strlen(pLua),"testLuaScript0Chunk"); if(LUA_OK==lua_pcall(lua, 0,0,0)) { printf("lua 腳本調(diào)用成功! "); } //彈出堆棧所有數(shù)據(jù) CLEAR(lua); ///加載lua腳本 并且編譯運(yùn)行l(wèi)ua腳本 //從當(dāng)前工作目錄加載 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個(gè)參數(shù) ",n); CLEAR(lua); //加載函數(shù)到堆棧 //調(diào)用的是無(wú)參函數(shù) lua_getglobal(lua,"testHello") ; n=lua_gettop(lua); printf("lua堆棧中有%d個(gè)參數(shù) ",n); //lua 函數(shù)調(diào)用會(huì)自動(dòng)清算堆棧 lua_pcall(lua, 0,0,0); n=lua_gettop(lua); printf("lua堆棧中有%d個(gè)參數(shù) ",n); lua_getglobal(lua,"Closer") ; //函數(shù)壓入棧頂 lua_pushinteger(lua,1); lua_pushinteger(lua,2);//壓入?yún)?shù) //閉包函數(shù)調(diào)用 if(LUA_OK!=lua_pcall(lua,2,1,0)) { printf("函數(shù)調(diào)用失敗! "); return 0 ; } int result=lua_tointeger(lua,⑴);//取出棧頂數(shù)據(jù) printf("Closer result:%d ",result); //注意清算堆棧返回值在 棧頂 POP1下 lua_pop(lua,1); n=lua_gettop(lua); printf("lua堆棧中有%d個(gè)參數(shù) ",n); /////LUA調(diào)用C++函數(shù) //注冊(cè)函數(shù) lua_register(lua, "CallC", callCPP); //從當(dāng)前工作目錄加載 if(luaL_dofile(lua,"./c1.lua")) { printf("lua c1腳本加載成功! "); } ///C/LUA閉包調(diào)用 lua_pushcfunction(lua,callCPP); lua_setglobal(lua,"CallCT");//設(shè)置lua中的調(diào)用 lua_getglobal(lua,"CloserT");//加載lua閉包函數(shù)到C++堆棧 lua_pushinteger(lua,2); //函數(shù)堆棧參數(shù)1定要正確 lua_pushinteger(lua,3); lua_pcall(lua,2,0,0); n=lua_gettop(lua); printf("lua堆棧中有%d個(gè)參數(shù) ",n); return 0; } </span>
c.lua 和c1.lua文件

--c.lua

str1="hello,I am Luaer" num1=2 num2=3 --測(cè)試函數(shù)輸出 str1 function testHello() print(str1) end --lua實(shí)現(xiàn)閉包 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





生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产在线观看一区二区 | 夜夜一区| 人人操日日干 | 黄色三级小视频 | 国产午夜精品一区二区三区四区 | 日本激情视频 | 亚洲精品国产一区 | 久久国产一区二区三区 | 国产色网| 国产高清一区二区三区 | 国产高清精品一区二区三区 | 精品成人一区 | 一区二区免费在线视频 | 伊人天天操 | 国产精品免费在线播放 | 久久久久久国产精品免费 | 污网站在线观看 | 在线久久 | 国内精品免费 | 一区二区三区不卡视频 | 婷婷久 | 国产欧美日韩综合精品 | 久久99精品久久久久久青青日本 | 国产精品毛片一区二区在线看 | 成人精品国产 | 国产伦精品一区二区三 | 久久久久亚洲一区二区三区 | 成人做爰视频www网站小优视频 | 国产大尺度视频 | 国产精品亚洲第一区在线暖暖韩国 | 天堂俺去俺来也www久久婷婷 | 日韩成人在线视频 | 欧美精三区欧美精三区 | 国产美女一区二区 | 国产免费福利 | 日本激情网| 精品国产不卡一区二区三区 | 黄色精品网站 | 国产欧美精品一区二区三区 | 久久免费毛片 | 欧美黑人巨大videos精品 |