天天看點

lua 進階3--lua檔案中調用C++函數

前面講了一下,C++讀取lua檔案中的變量,包括一維表、二維表這些,這節講一下如何在lua檔案中去調用C++函數

C++代碼如下

#include <stdio.h>
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/*Lua 解釋器指針
 */
lua_State* L;
static int average(lua_State *L)
{
  /*得到參數個數*/
  int n=lua_gettop(L);
  double sum=0;
  int i;
  for(i=1;i<=n;i++)
   {
    if(!lua_isnumber(L,i))
     {
       lua_pushstring(L,"Incorrect argument to 'average'");
       printf("%s\n",lua_tostring(L,i);
       printf("%s\n","is not a number");    
     }
    else
    {
     sum+=lua_tonumber(L,i);
     }
   }
   /*壓入平均值*/
   lua_pushnumber(L,sum/n);
   /*壓入和*/
   lua_pushnumber(L,sum);
   /*傳回傳回值的個數*/
   return 2;
}

int main ( int argc, char *argv[] ){
 
/*初始化Lua
 */
 L=lua_open();
 /*載入lua基本庫*/
 luaL_openlibs(L);
 lua_register(L,"average",average);
 
 /*運作腳本
 */
  luaL_dofile(L,"test.lua");

/*清除Lua
 */
 lua_close(L);
 /*暫停*/
 printf("Press enter to exit ..");
 getchar();
 return 0;

}
           

lua 檔案(test.lua)的代碼如下

--call a C++ function
avg,sum = average(10,20,30,40,50,"ssss")
print("The average is ",avg)
print("The sum is",sum)
           

注意 最主要的是 

 要寫一個能讓Lua調用的C函數,就要符合lua_CFunction定義:typedef int (*lua_CFunction) (lua_State *L);

    當Lua調用C函數的時候,同樣使用棧來互動。C函數從棧中擷取她的參數,調用結束後将結果放到棧中,并傳回放到棧中的結果個數。

    這兒有一個重要的概念:用來互動的棧不是全局棧,每一個函數都有他自己的私有棧。當Lua調用C函數的時候,第一個參數總是在這個私有棧的index=1的位置

 上面定義的C函數是 static int average(lua_State *L)  static 可要可不要 static 函數隻表示在目前檔案中可用,在其他檔案中不可用  

   

     lua_pushnumber(L,sum/n);  (表示将結果壓入棧中 t[1])

    

     lua_pushnumber(L,sum);       (表示将結果壓入棧中 t[2])

    

     return 2;

 如果傳回值有多個 比如3個 那麼一定要return 3 否則的話(比如還是return 2 ,那麼有一個傳回值擷取不到 而且傳回值順序也不對應) 不成功

    lua_register(L,"average",average); //  第二個參數表示提供給lua檔案的接口 第三個參數 C++中的函數名

 初學lua 還不是特别熟,現在還是應用階段,隻能慢慢去深入