呼叫Lua函式

2021-05-22 00:57:17 字數 2007 閱讀 7198

翻譯自http://gamedevgeek.com/tutorials/calling-lua-functions/

呼叫lua函式

這是lua指令碼語言教程系列之二。在第一篇中,我們學習了在windows和linux下編譯並執行"hello, world!"程式。如果你沒有看過,請參考lua入門一文。

這篇文章將教你如何在lua中定義乙個函式,然後在c/c++程式中呼叫它。同時,我們將學習到引數傳遞,返回值,以及處理全域性變數。

你的第乙個lua函式

在lua中定義函式是相當簡單的。lua函式以關鍵字"function"開頭,後面跟隨函式名,然後是引數列表。函式定義以關鍵字"end"結束。lua函式能夠接受多個引數,而且可以返回多個引數。

下面是乙個實現兩個數相加並返回結果的lua函式。我們將它儲存為"add.lua"檔案。

-- add two numbers

function add ( x, y )

return x + y

end在lua入門中,我們已經知道呼叫lual_dofile()就是執行指令碼。因為在本文中我們只定義了乙個函式,故只需簡單地呼叫lual_dofile()函式就能執行add函式。

我在前面已經說過,lua函式能夠接受多個引數,返回多個結果。這是用棧來實現的。

為了呼叫乙個lua函式,首先需要將函式壓入棧中。再將引數壓入。然後,呼叫lua_call()去呼叫lua函式。函式呼叫完成之後,返回值存在於棧中。所有這些步驟將被展示在luaadd()函式定義中。

呼叫lua_getglobal()將add()函式壓入棧中。

呼叫lua_pushnumber()將第乙個引數x壓入棧中。

同樣,呼叫lua_pushnumber()將第二個引數y壓入棧中。

呼叫lua_call(),其引數的意思是兩個引數,乙個返回值。

現在,我們可以利用lua_tointeger()獲得整型返回值。

最後,呼叫lua_pop()將值從棧中移出。

儲存檔案為luaadd.cpp。如果你直接使用c而不是c++,將檔名改為luaadd.c,然後將extern "c"刪除。

#include

extern "c"

/* 指向lua直譯器的指標 */

lua_state* l;

int luaadd ( int x, int y )

int main ( int argc, char *argv )

編譯在linux下,在命令列鍵入:

g++ luaadd.cpp -llua -ldl -o luaadd

然後,鍵入下列命令執行:

./luaadd

如果沒有問題, 程式將顯示結果為: "the sum is 25"。

在visual c++你將需要進行下列步驟:

建立乙個新的空win32控制台應用工程。

將"luatest.cpp"加入你的工程。

選擇專案選單中的屬性選單。

在"聯結器"的"輸入"欄目的"附加依賴項"中輸入"lua5.1.lib"。

確定。

此時,按f7構建程式。

如果你採用的是dll庫,請確保將其放在應用程式的目錄中或者windows系統能夠找到它的地方。如果你採用的是靜態連線庫,則不需要。 

全域性變數

全域性變數在lua中也很好處理。就像我們看到的,lua_getglobal()將乙個lua全域性變數壓入棧中。例如,在lua指令碼中包含乙個全域性變數z,下面**的功能就是得到它的值:

lua_getglobal(l, "z");

z = (int)lua_tointeger(l, -1);

lua_pop(l, 1);

相應地,lua_setglobal()函式能夠設定全域性變數地值。下面這段**演示了如何將lua全域性變數z的值變為10:

lua_pushnumber(l, 10);

lua_setglobal(l, "z");

應該記住:在lua中,我們沒有必要顯式定義乙個全域性變數。如果全域性變數不存在,呼叫lua_setglobal()將為你建立乙個。

lua呼叫c函式

最近在進入lua程式設計的狀態,一度令我困惑的是,lua提供的功能少的可憐,跟自備電池的python相比,可說是簡陋了。連table的列印,都需要自己實現,也因此有了一打的第三方方案。後來我想明白了,以lua和c如此緊密的關係,只需要建立lua的binding,那麼豐富而效能強大的c庫資源完全可以為...

lua呼叫c函式

lua可以呼叫c函式的能力將極大的提高lua的可擴充套件性和可用性。對於有些和作業系統相關的功能,或者是對效率要求較高的模組,我們完全可以通過c函式來實現,之後再通過lua呼叫指定的c函式。對於那些可被lua呼叫的c函式而言,其介面必須遵循lua要求的形式,即 typedef int lua cfu...

lua檔案函式呼叫

lua指令碼是面向過程的語言,一般檔案結構 data.lua local idata 0 local arrdata local表示區域性變數或函式 只要沒有local宣告就是全域性的 iopen是全域性變數 optdata是私有函式 local function optdata iopen 10 ...