前面講了一下,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 還不是特別熟,現在還是應用階段,只能慢慢去深入