解析調(diào)用Lua函數(shù)使用方法
調(diào)用Lua函數(shù)使用方法是本文要介紹的內(nèi)容,本教程涵蓋了Lua5.1。在Lua的每一個(gè)版本中都有一些非常不同之處。下面的示例代碼將不能在老版本的Lua下運(yùn)行。這篇文章將教你如何在Lua中定義一個(gè)函數(shù),然后在C/C++程序中調(diào)用它。同時(shí),我們將學(xué)習(xí)到參數(shù)傳遞,返回值,以及處理全局變量。
你的***個(gè)Lua函數(shù)
在Lua中定義函數(shù)是相當(dāng)簡(jiǎn)單的。Lua函數(shù)以關(guān)鍵字"function"開(kāi)頭,后面跟隨函數(shù)名,然后是參數(shù)列表。函數(shù)定義以關(guān)鍵字"end"結(jié)束。Lua函數(shù)能夠接受多個(gè)參數(shù),而且可以返回多個(gè)參數(shù)。
下面是一個(gè)實(shí)現(xiàn)兩個(gè)數(shù)相加并返回結(jié)果的Lua函數(shù)。我們將它保存為"add.lua"文件。
- -- add two numbersfunction add ( x, y )return x + yend
在Lua入門(mén)中,我們已經(jīng)知道調(diào)用luaL_dofile()就是執(zhí)行腳本。因?yàn)樵诒疚闹形覀冎欢x了一個(gè)函數(shù),故只需簡(jiǎn)單地調(diào)用luaL_dofile()函數(shù)就能執(zhí)行add函數(shù)。
我在前面已經(jīng)說(shuō)過(guò),Lua函數(shù)能夠接受多個(gè)參數(shù),返回多個(gè)結(jié)果。這是用棧來(lái)實(shí)現(xiàn)的。
為了調(diào)用一個(gè)Lua函數(shù),首先需要將函數(shù)壓入棧中。再將參數(shù)壓入。然后,調(diào)用lua_call()去調(diào)用Lua函數(shù)。函數(shù)調(diào)用完成之后,返回值存在于棧中。所有這些步驟將被展示在luaadd()函數(shù)定義中。
調(diào)用lua_getglobal()將add()函數(shù)壓入棧中。
調(diào)用lua_pushnumber()將***個(gè)參數(shù)x壓入棧中。
同樣,調(diào)用lua_pushnumber()將第二個(gè)參數(shù)y壓入棧中。
調(diào)用lua_call(),其參數(shù)的意思是兩個(gè)參數(shù),一個(gè)返回值。
現(xiàn)在,我們可以利用lua_tointeger()獲得整型返回值。
***,調(diào)用lua_pop()將值從棧中移出。
保存文件為luaadd.cpp。如果你直接使用C而不是C++,將文件名改為luaadd.c,然后將extern "C"刪除。
- #include <stdio.h> extern "C" {
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- }
- /* 指向Lua解釋器的指針 */
- lua_State* L;
- int luaadd (
- int x, int y
- ){
- int sum;
- /* 通過(guò)名字得到Lua函數(shù) */
- lua_getglobal(L, "add");
- /* ***個(gè)參數(shù) */
- lua_pushnumber(L, x);
- /* 第二個(gè)參數(shù) */
- lua_pushnumber(L, y);
- /* 調(diào)用函數(shù),告知有兩個(gè)參數(shù),一個(gè)返回值 */
- lua_call(L, 2, 1);
- /* 得到結(jié)果 */
- sum = (int)lua_tointeger(L, -1);
- lua_pop(L, 1);
- return sum;
- }
- int main ( int argc, char *argv[] ){
- int sum;
- /* 初始化Lua */
- L = lua_open();
- /* 載入Lua基本庫(kù) */
- luaL_openlibs(L);
- /* 載入腳本 */
- luaL_dofile(L, "add.lua");
- /* 調(diào)用Lua函數(shù) */
- sum = luaadd( 10, 15 );
- /* 顯示結(jié)果 */
- printf( "The sum is %d/n", sum );
- /* 清除Lua */
- lua_close(L);
- /* 暫停 */
- printf( "Press enter to exit…" );
- getchar();
- return 0;
- }
編譯
在Linux下,在命令行鍵入:
- g++ luaadd.cpp -llua -ldl -o luaadd
然后,鍵入下列命令運(yùn)行:
- ./luaadd
如果沒(méi)有問(wèn)題, 程序?qū)@示結(jié)果為: "The sum is 25"。
在Visual C++你將需要進(jìn)行下列步驟:
創(chuàng)建一個(gè)新的空Win32控制臺(tái)應(yīng)用工程。
將"luatest.cpp"加入你的工程。
選擇項(xiàng)目菜單中的屬性菜單。
在"連接器"的"輸入"欄目的"附加依賴(lài)項(xiàng)"中輸入"lua5.1.lib"。
確定。
此時(shí),按F7構(gòu)建程序。
如果你采用的是dll庫(kù),請(qǐng)確保將其放在應(yīng)用程序的目錄中或者windows系統(tǒng)能夠找到它的地方。如果你采用的是靜態(tài)連接庫(kù),則不需要。
全局變量
全局變量在Lua中也很好處理。就像我們看到的,lua_getglobal()將一個(gè)Lua全局變量壓入棧中。例如,在Lua腳本中包含一個(gè)全局變量z,下面代碼的功能就是得到它的值:
- lua_getglobal(L, "z");z = (int)lua_tointeger(L, -1);lua_pop(L, 1);
相應(yīng)地,lua_setglobal()函數(shù)能夠設(shè)置全局變量地值。下面這段代碼演示了如何將Lua全局變量z的值變?yōu)?0:
- lua_pushnumber(L, 10);lua_setglobal(L, "z");
應(yīng)該記住:在Lua中,我們沒(méi)有必要顯式定義一個(gè)全局變量。如果全局變量不存在,調(diào)用lua_setglobal()將為你創(chuàng)建一個(gè)。
小結(jié):解析調(diào)用Lua函數(shù)使用方法的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!