【走進Lua的世界之五】C++調用Lua函數

經過前面4篇文章的介紹,我們對lua的堆棧已經比較熟悉了。下面我們來看看C++是怎麼調用lua的函數。

首先,我們來看看lua文件是什麼樣的:

-- helloLua.lua 文件
myName="beautiful girl"
helloTable={name="cfy",age=23}

function helloAdd(num1,num2)
    retrun(num1,num2)
end

我們觀察到多了一個helloAdd函數,現在我們就用C++來調用這個函數。

創建一個項目,名爲“CppCallLua”,依舊創建一個HelloLua類,主要代碼如下:

bool HelloLua::init()
{
  /* 初始化 */
  lua_State* pL=lua_open();
  luaopen_base(pL);
 
  /* 執行腳本 */
  luaL_dofile(pL,"helloLua.lua");

  /* 重置棧頂元素 */
  lua_settop(pL,0)

  /* 把helloAdd函數對象放到棧中 */
  lua_getglobal(pL,"helloAdd");

  /* 把函數所需要的參數入棧 */
  lua_pushnumber(pL,3);
  lua_pushnumber(pL,4);

  /* 執行函數,第二個參數表示函數的參數個數,第三個參數表示函數返回值個數
     lua會先去堆棧去出參數,然後再取出函數對象,開始執行函數 */
  lua_call(pL,2,1);

  int iResult=lua_tonumber(pL,-1);
  CCLOG("iResult=%d",iResult);
  return true;

}

總結一下:

(1)執行腳本

(2)將helloAdd函數放到棧中:lua_getglobal(pL,"helloAdd")

(3)helloAdd有2個參數,我們要把參數傳遞給lua,所以2個參數都要放到棧裏

(4)第二和第三步已經把函數所需要的數據都放到棧裏了,接下來只要告訴lua去棧裏取數據,然後執行函數,調用lua_call就可以了。


用調試模式運行項目,將看到如下日誌輸出:

iResult=7


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章