天天看點

函數堆棧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堆棧停止據數互交

繼續閱讀