




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、通過(guò)例子學(xué)Lua正式版 閱讀方法和聲明請(qǐng)按 視圖-文檔結(jié)構(gòu)圖,來(lái)查看本文檔,問(wèn)文檔中所有文章都轉(zhuǎn)自網(wǎng)絡(luò),未經(jīng)作者允許,不得用于商業(yè)用途前言Lua是一種完全免費(fèi)的腳本語(yǔ)言, 可以和C/C+語(yǔ)言緊密結(jié)合,它的官方網(wǎng)站在./ 在網(wǎng)站上可以下載到lua的源碼, 沒(méi)有可執(zhí)行版本, 不過(guò)不用擔(dān)心, 因?yàn)閘ua源碼可以在任何一種C/C+的編譯器上編譯.如果要學(xué)習(xí)Lua, 官方網(wǎng)站上的Reference是必備的,上面有每個(gè)命令的用法,非常詳細(xì)。參考手冊(cè) 作者寫(xiě)的Programming in Lua 2.編譯如果用的VC6, 可以下載所需的project文件,地址在VSNET2
2、003可以下載這個(gè)sln文件偶用的是cygwin和linux, 打入以下命令即可,tar -zxvf lua-.tar.gzsh ./configuremake這樣就OK了。為了以后使用方便,最好把bin目錄加入到path里面。通過(guò)例子學(xué)習(xí)Lua(1) - Hello World把以下程序打入文件e01.lua例1:e01.lua- Hello World in Lua print("Hello World.")Lua有兩種執(zhí)行方式,一種是嵌入到C程序中執(zhí)行,還有一種是直接從命令行方式下執(zhí)行。這里為了調(diào)試方便,采用第二種方式,執(zhí)行命令 lua e01.lua輸出結(jié)果應(yīng)該是:
3、Hello World.4.程序說(shuō)明第一行 - Hello World in Lua這句是注釋?zhuān)渲?和C+中的/意思是一樣的第二行 print("Hello World.")調(diào)用lua內(nèi)部命令print,輸出"Hello World."字符串到屏幕,Lua中的字符串全部是由"括起來(lái)的。這個(gè)命令是一個(gè)函數(shù)的調(diào)用,print是lua的一個(gè)函數(shù),而"Hello World."是print的參數(shù)。5.試試看在Lua中有不少字符串的處理操作,本次的課后試試看的內(nèi)容就是,找出連接兩個(gè)字符串的操作,并且print出來(lái)。通過(guò)例子學(xué)習(xí)Lua
4、(2) - Lua流程控制 (轉(zhuǎn)) 1. 函數(shù)的使用以下程序演示了如何在Lua中使用函數(shù), 及局部變量例e02.lua- functions function pythagorean(a, b) local c2 = a2 + b2 return sqrt(c2) end print(pythagorean(3,4)運(yùn)行結(jié)果5程序說(shuō)明在Lua中函數(shù)的定義格式為:function 函數(shù)名(參數(shù)).end與Pascal語(yǔ)言不同, end不需要與begin配對(duì), 只需要在函數(shù)結(jié)束后打個(gè)end就可以了.本例函數(shù)的作用是已知直角三角形直角邊, 求斜邊長(zhǎng)度. 參數(shù)a,
5、b分別表示直角邊長(zhǎng),在函數(shù)內(nèi)定義了local形變量用于存儲(chǔ)斜邊的平方. 與C語(yǔ)言相同, 定義在函數(shù)內(nèi)的代碼不會(huì)被直接執(zhí)行, 只有主程序調(diào)用時(shí)才會(huì)被執(zhí)行.local表示定義一個(gè)局部變量, 如果不加local剛表示c2為一個(gè)全局變量, local的作用域是在最里層的end和其配對(duì)的關(guān)鍵字之間, 如if . end, while . end等。全局變量的作用域是整個(gè)程序。2. 循環(huán)語(yǔ)句例e03.lua- Loops for i=1,5 do print("i is now " . i) end運(yùn)行結(jié)果i is now 1 i is now 2 i is now 3
6、i is now 4 i is now 5程序說(shuō)明這里偶們用到了for語(yǔ)句for 變量 = 參數(shù)1, 參數(shù)2, 參數(shù)3 do循環(huán)體end變量將以參數(shù)3為步長(zhǎng), 由參數(shù)1變化到參數(shù)2例如: for i=1,f(x) do print(i) endfor i=10,1,-1 do print(i) end這里print("i is now " . i)中,偶們用到了.,這是用來(lái)連接兩個(gè)字符串的,偶在(1)的試試看中提到的,不知道你們答對(duì)了沒(méi)有。雖然這里i是一個(gè)整型量,Lua在處理的時(shí)候會(huì)自動(dòng)轉(zhuǎn)成字符串型,不需偶們費(fèi)心。3. 條件分支語(yǔ)句例e04.lua- Loop
7、s and conditionals for i=1,5 doprint(“i is now “ . i) if i < 2 then print(“small”) elseif i < 4 then print(“medium”) else print(“big”)
8、 end end運(yùn)行結(jié)果i is now 1 small i is now 2 medium i is now 3 medium i is now 4 big i is now 5 big程序說(shuō)明if else用法比較簡(jiǎn)單, 類(lèi)似于C語(yǔ)言, 不過(guò)此處需要注意的是整個(gè)if只需要一個(gè)end,哪怕用了多個(gè)elseif, 也是一個(gè)end.例如 if op = "+" then r = a + b elseif op = "-" then r =
9、a - b elseif op = "*" then r = a*b elseif op = "/" then r = a/b else error("invalid operation") end4.試試看Lua中除了for循環(huán)以外, 還支持多種循環(huán), 請(qǐng)用while.do和repeat.until改寫(xiě)本文中的for程序通過(guò)例子學(xué)習(xí)Lua(3) - Lua數(shù)據(jù)結(jié)構(gòu) (轉(zhuǎn)) 1.簡(jiǎn)介L(zhǎng)ua語(yǔ)言只有一種基本數(shù)據(jù)結(jié)
10、構(gòu), 那就是table, 所有其他數(shù)據(jù)結(jié)構(gòu)如數(shù)組啦,類(lèi)啦, 都可以由table實(shí)現(xiàn).2.table的下標(biāo)例e05.lua- Arrays myData = myData0 = “foo” myData1 = 42 - Hash tables myData“bar” = “baz” - Iterate through the - structure for key, value in myData do print(key . “=“ . value) end輸出結(jié)果0=foo 1=42 bar=baz程序說(shuō)明首先定義了一個(gè)table myData=, 然后用數(shù)字作為下標(biāo)賦了兩個(gè)值
11、給它. 這種定義方法類(lèi)似于C中的數(shù)組, 但與數(shù)組不同的是, 每個(gè)數(shù)組元素不需要為相同類(lèi)型,就像本例中一個(gè)為整型, 一個(gè)為字符串.程序第二部分, 以字符串做為下標(biāo), 又向table內(nèi)增加了一個(gè)元素. 這種table非常像STL里面的map. table下標(biāo)可以為L(zhǎng)ua所支持的任意基本類(lèi)型, 除了nil值以外.Lua對(duì)Table占用內(nèi)存的處理是自動(dòng)的, 如下面這段代碼 a = a"x" = 10 b = a - b' refers to the same table as a' pri
12、nt(b"x") -> 10 b"x" = 20 print(a"x") -> 20 a = nil - now only b' still refers to the table b = nil - now there are no references left to the tableb和a都指向相同的table, 只占用一塊內(nèi)存, 當(dāng)執(zhí)行到a = nil時(shí), b仍然指向table,而當(dāng)執(zhí)行到b=nil時(shí), 因?yàn)闆](méi)有指向table的變
13、量了, 所以Lua會(huì)自動(dòng)釋放table所占內(nèi)存3.Table的嵌套Table的使用還可以嵌套,如下例例e06.lua- Table constructor myPolygon = color=“blue”, thickness=2, npoints=4; x=0, y=0, x=-10, y=0, x=-5, y=4, x=0, y=4 - Print the color print(myPolygon“color”) - Print it again using do
14、t - notation print(myPolygon.color) - The points are accessible - in myPolygon1 to myPolygon4 - Print the second points x - coordinate print(myPolygon2.x)程序說(shuō)明首先建立一個(gè)table, 與上一例不同的是,在table的constructor里面有x=0,y=0, 這是什么意思呢? 這其實(shí)就是一個(gè)小table, 定義在了大table之內(nèi), 小table的table名省略了.最后一行myPolygon2.x,就是大table里面小table的訪
15、問(wèn)方式.通過(guò)例子學(xué)習(xí)Lua(4) - 函數(shù)的調(diào)用 (轉(zhuǎn)) 1. 不定參數(shù)例e07.lua- Functions can take a - variable number of - arguments. function funky_print (.) for i=1, arg.n do print("FuNkY: " . arg) end end funky_print("one", "two")運(yùn)行結(jié)果FuNkY: one FuNkY: two程序說(shuō)明* 如果以.
16、為參數(shù), 則表示參數(shù)的數(shù)量不定.* 參數(shù)將會(huì)自動(dòng)存儲(chǔ)到一個(gè)叫arg的table中.* arg.n中存放參數(shù)的個(gè)數(shù). arg加下標(biāo)就可以遍歷所有的參數(shù).2.以table做為參數(shù)例e08.lua- Functions with table- parameters function print_contents(t) for k,v in t do print(k . "=" . v) end end print_contentsx=10, y=20運(yùn)行結(jié)果x=10 y=20程序說(shuō)明* print_conten
17、tsx=10, y=20這句參數(shù)沒(méi)加圓括號(hào), 因?yàn)橐詥蝹€(gè)table為參數(shù)的時(shí)候, 不需要加圓括號(hào)* for k,v in t do 這個(gè)語(yǔ)句是對(duì)table中的所有值遍歷, k中存放名稱(chēng), v中存放值3.把Lua變成類(lèi)似XML的數(shù)據(jù)描述語(yǔ)言例e09.luafunction contact(t) - add the contact t, which is - stored as a table, to a database endcontact name = "Game Developer", email = "
18、", url = "", quote = There are 10 types of people who can understand binary. contact - some other contact 程序說(shuō)明* 把function和table結(jié)合, 可以使Lua成為一種類(lèi)似XML的數(shù)據(jù)描述語(yǔ)言* e09中contact., 是一種函數(shù)的調(diào)用方法, 不要弄混了* .是表示多行字符串的方法* 當(dāng)使用C API時(shí)此種方式的優(yōu)勢(shì)更明顯, 其中cont
19、act.部分可以另外存成一配置文件4.試試看想想看哪些地方可以用到例e09中提到的配置方法呢?通過(guò)例子學(xué)習(xí)Lua(5) - Lua與C交互入門(mén) (轉(zhuǎn))1. 簡(jiǎn)介L(zhǎng)ua與C/C+結(jié)合是很緊密的, Lua與C+交互是建立在Lua與C的基礎(chǔ)上的, 所以偶先從Lua與C講起.正如第一講所說(shuō), 運(yùn)行Lua程序或者說(shuō)調(diào)用Lua主要有兩種方式:* 通過(guò)命令行執(zhí)行"Lua"命令* 通過(guò)Lua的C庫(kù)雖然此前偶們一直用第一種方式, 但偶要告訴你, 通過(guò)Lua的C庫(kù)執(zhí)行才是游戲中常用的方式.2.Lua的C庫(kù)Lua的C庫(kù)可以做為Shared Library調(diào)用, 但一般開(kāi)發(fā)游戲時(shí)會(huì)把Lua的所有源
20、程序都包含在內(nèi), 并不把Lua編譯成共享庫(kù)的形式. 因?yàn)長(zhǎng)ua程序只有100多K, 而且?guī)缀蹩梢栽谌魏尉幾g器下Clean Compile. 帶Lua源程序的另一個(gè)好處時(shí), 可以隨時(shí)對(duì)Lua本身進(jìn)行擴(kuò)充, 增加偶們所需的功能.Lua的C庫(kù)提供一系列API:* 管理全局變量* 管理tables* 調(diào)用函數(shù)* 定義新函數(shù), 這也可以完全由C實(shí)現(xiàn)* 垃圾收集器Garbage collector, 雖然Lua可以自動(dòng)進(jìn)行, 但往往不是立即執(zhí)行的,所以對(duì)實(shí)時(shí)性要求比較高的程序, 會(huì)自己調(diào)用垃圾收集器* 載入并執(zhí)行Lua程序, 這也可以由Lua自身實(shí)現(xiàn)* 任何Lua可以實(shí)現(xiàn)的功能, 都可以通過(guò)Lua的C A
21、PI實(shí)現(xiàn), 這對(duì)于優(yōu)化程序的運(yùn)行速度有幫助. 經(jīng)常調(diào)用的共用的Lua程序片斷可以轉(zhuǎn)成C程序, 以提高效率. 連Lua都是C寫(xiě)的還有什么C不能實(shí)現(xiàn)呢?3.Lua與C集成的例子例e10.c/* A simple Lua interpreter. */ #include <stdio.h> #include <lua.h> int main(int argc, char *argv) char lineBUFSIZ; lua_State *L = lua_open(0); while (fgets(line, sizeof(line)
22、, stdin) != 0) lua_dostring(L, line); lua_close(L); return 0; 編譯Linux/Cygwin* 先編譯Lua, 并把頭文件放入include路徑* gcc e10.c -llua -llualib -o e10VC6/VC2003* 先編譯Lua, 在Option中設(shè)置頭文件和庫(kù)文件路徑* 新建工程,在工程配置中加入附加庫(kù)lua.lib和lualib.lib* 編譯成exe運(yùn)行結(jié)果本程序的功能是實(shí)現(xiàn)一個(gè)Lua解釋器, 輸入的每行字符都會(huì)被解釋成Lua并執(zhí)行.程序說(shuō)明
23、* #include <lua.h> 包含lua頭文件, 然后才可以使用API* lua_State *L = lua_open(0) 打開(kāi)一個(gè)Lua執(zhí)行器* fgets(line, sizeof(line), stdin) 從標(biāo)準(zhǔn)輸入里讀入一行* lua_dostring(L, line) 執(zhí)行此行* lua_close(L) 關(guān)閉Lua執(zhí)行器例e11.c/* Another simple Lua interpreter. */ #include <stdio.h> #include <lua.h> #include <lualib.h> in
24、t main(int argc, char *argv) char lineBUFSIZ; lua_State *L = lua_open(0); lua_baselibopen(L); lua_iolibopen(L); lua_strlibopen(L); lua_mathlibopen(L); while (fgets(line, sizeof(line), stdin) != 0) lua_dostring(L, line); lua
25、_close(L); return 0; 運(yùn)行結(jié)果本程序的功能是實(shí)現(xiàn)一個(gè)Lua解釋器, 輸入的每行字符都會(huì)被解釋成Lua并執(zhí)行.與上例不同的是, 本例調(diào)用了Lua的一些標(biāo)準(zhǔn)庫(kù).程序說(shuō)明* #include <lualib.h> 包含Lua的標(biāo)準(zhǔn)庫(kù)* 以下這幾行是用來(lái)讀入Lua的一些庫(kù), 這樣偶們的Lua程序就可以有更多的功能.lua_baselibopen(L); lua_iolibopen(L); lua_strlibopen(L); lua_mathlibopen(L); 4.試試看把上面兩個(gè)小例子在你熟悉的編譯器中編譯執(zhí)
26、行, 并試試能否與Lua源碼樹(shù)一起編譯通過(guò)例子學(xué)習(xí)Lua(6) - C/C+中用Lua函數(shù)(轉(zhuǎn)) 1. 簡(jiǎn)介偶們這次主要說(shuō)說(shuō)怎么由Lua定義函數(shù), 然后在C或者C+中調(diào)用. 這里偶們暫不涉及C+的對(duì)象問(wèn)題, 只討論調(diào)用函數(shù)的參數(shù), 返回值和全局變量的使用.2.這里偶們?cè)趀12.lua里先定義一個(gè)簡(jiǎn)單的add(), x,y為加法的兩個(gè)參數(shù), return 直接返回相加后的結(jié)果.例e12.lua- add two numbersfunction add ( x, y )return x + yend在前一次里, 偶們說(shuō)到 lua_dofile() 可以直接在C中執(zhí)行l(wèi)ua文件. 因?yàn)榕紓冞@個(gè)程序里
27、只定義了一個(gè)add()函數(shù), 所以程序執(zhí)行后并不直接結(jié)果, 效果相當(dāng)于在C中定義了一個(gè)函數(shù)一樣.Lua的函數(shù)可以有多個(gè)參數(shù), 也可以有多個(gè)返回值, 這都是由棧(stack)實(shí)現(xiàn)的.需要調(diào)用一個(gè)函數(shù)時(shí), 就把這個(gè)函數(shù)壓入棧, 然后順序壓入所有參數(shù), 然后用lua_call()調(diào)用這個(gè)函數(shù). 函數(shù)返回后, 返回值也是存放在棧中. 這個(gè)過(guò)程和匯編執(zhí)行函數(shù)調(diào)用的過(guò)程是一樣的.例e13.cpp 是一個(gè)調(diào)用上面的Lua函數(shù)的例子#include <stdio.h>extern "C" / 這是個(gè)C+程序, 所以要extern "C", / 因
28、為lua的頭文件都是C格式的#include "lua.h"#include "lualib.h"#include "lauxlib.h"/* the Lua interpreter */lua_State* L;int luaadd ( int x, int y )int sum;/* the function name */lua_getglobal(L, "add");/* the first argument */lua_pushnumber(L, x);/* the second argument */l
29、ua_pushnumber(L, y);/* call the function with 2 arguments, return 1 result */lua_call(L, 2, 1);/* get the result */sum = (int)lua_tonumber(L, -1);lua_pop(L, 1);return sum;int main ( int argc, char *argv )int sum;/* initialize Lua */L = lua_open();/* load Lua base libraries */lua_baselibopen(L)
30、;/* load the script */lua_dofile(L, "e12.lua");/* call the add function */sum = luaadd( 10, 15 );/* print the result */printf( "The sum is %d", sum );/* cleanup Lua */lua_close(L);return 0;程序說(shuō)明:main中過(guò)程偶們上次已經(jīng)說(shuō)過(guò)了, 所以這次只說(shuō)說(shuō)luaadd的過(guò)程* 首先用lua_getglobal()把a(bǔ)dd函數(shù)壓棧* 然后用lua_pushnumber()依次把
31、x,y壓棧* 然后調(diào)用lua_call(), 并且告訴程序偶們有兩個(gè)參數(shù)一個(gè)返回值* 接著偶們從棧頂取回返回值, 用lua_tonumber()* 最后偶們用lua_pop()把返回值清掉運(yùn)行結(jié)果:The sum is 25編譯方法Linux下把程序存成e13.cppg+ e13.cpp -llua -llualib -o e13./e13VC下編譯方法* 首先建立一個(gè)空的Win32 Console Application Project* 把e13.cpp加入工程中* 點(diǎn)project setting,然后設(shè)置link選項(xiàng), 再加上lua.lib lualib.lib兩個(gè)額外的庫(kù)* 最后編譯
32、建立好的project可以在這里下載VC Linux 3.全局變量上面偶們用到了lua_getglobal()但并沒(méi)有詳細(xì)講, 這里偶們?cè)倥e兩個(gè)小例子來(lái)說(shuō)下全局變量lua_getglobal()的作用就是把lua中全局變量的值壓入棧lua_getglobal(L, "z");z = (int)lua_tonumber(L, 1);lua_pop(L, 1);假設(shè)Lua程序中定義了一個(gè)全局變量z, 這段小程序就是把z的值取出放入C的變量z中.另外Lua中還有一個(gè)對(duì)應(yīng)的函數(shù)lua_setglobal(), 作用是用棧頂?shù)闹堤畛渲付ǖ娜肿兞縧ua_pushnumber(L, 1
33、0);lua_setglobal(L, "z");例如這段小程序就是把lua中的全局變量z設(shè)為10, 如果lua中未定義z的話(huà), 就會(huì)自動(dòng)創(chuàng)建一個(gè)全局變量z并設(shè)為10.4.試試看自己寫(xiě)個(gè)函數(shù)用C/C+來(lái)調(diào)用下試試2.通過(guò)例子學(xué)習(xí)Lua(7) - Lua中調(diào)用C/C+函數(shù) (轉(zhuǎn)) 1. 前言上次偶說(shuō)到從C/C+中調(diào)用Lua的函數(shù), 然后就有朋友問(wèn)從Lua中如何調(diào)用C/C+的函數(shù), 所以偶們這次就來(lái)說(shuō)說(shuō)這個(gè)問(wèn)題. 首先偶們會(huì)在C+中建立一個(gè)函數(shù), 然后告知Lua有這個(gè)函數(shù), 最后再執(zhí)行它. 另外, 由于函數(shù)不是在Lua中定義的, 所以無(wú)法確定函數(shù)的正確性, 可能在調(diào)用
34、過(guò)程中會(huì)出錯(cuò), 因此偶們還會(huì)說(shuō)說(shuō)Lua出錯(cuò)處理的問(wèn)題.2.Lua中調(diào)用C函數(shù)在lua中是以函數(shù)指針的形式調(diào)用函數(shù), 并且所有的函數(shù)指針都必須滿(mǎn)足如下此種類(lèi)型:typedef int (*lua_CFunction) (lua_State *L);也就是說(shuō), 偶們?cè)贑+中定義函數(shù)時(shí)必須以lua_State為參數(shù), 以int為返回值才能被Lua所調(diào)用. 但是不要忘記了, 偶們的lua_State是支持棧的, 所以通過(guò)??梢詡鬟f無(wú)窮個(gè)參數(shù), 大小只受內(nèi)存大小限制. 而返回的int值也只是指返回值的個(gè)數(shù)真正的返回值都存儲(chǔ)在lua_State的棧中. 偶們通常的做法是做一個(gè)wrapper, 把所有需要調(diào)
35、用的函數(shù)都wrap一下, 這樣就可以調(diào)用任意的函數(shù)了. 下面這個(gè)例子是一個(gè)C+的average()函數(shù), 它將展示如何用多個(gè)參數(shù)并返回多個(gè)值例e14.cpp#include <stdio.h>extern "C" #include "lua.h"#include "lualib.h"#include "lauxlib.h"/* the Lua interpreter */lua_State* L;static int average(lua_State *L)/* get number of argum
36、ents */int n = lua_gettop(L);double sum = 0;int i;/* loop through each argument */for (i = 1; i <= n; i+)/* total the arguments */sum += lua_tonumber(L, i);/* push the average */lua_pushnumber(L, sum / n);/* push the sum */lua_pushnumber(L, sum);/* return the number of results */return 2;int main
37、 ( int argc, char *argv )/* initialize Lua */L = lua_open();/* load Lua base libraries */lua_baselibopen(L);/* register our function */lua_register(L, "average", average);/* run the script */lua_dofile(L, "e15.lua");/* cleanup Lua */lua_close(L);return 0;例e15.lua- call a C+ funct
38、ionavg, sum = average(10, 20, 30, 40, 50)print("The average is ", avg)print("The sum is ", sum)程序說(shuō)明:* lua_gettop()的作用是返回棧頂元素的序號(hào). 由于Lua的棧是從1開(kāi)始編號(hào)的,所以棧頂元素的序號(hào)也相當(dāng)于棧中的元素個(gè)數(shù). 在這里, 棧中元素的個(gè)數(shù)就是傳入的參數(shù)個(gè)數(shù).* for循環(huán)計(jì)算所有傳入?yún)?shù)的總和. 這里用到了數(shù)值轉(zhuǎn)換lua_tonumber().* 然后偶們用lua_pushnumber()把平均值和總和push到棧中.* 最后, 偶們返
39、回2, 表示有兩個(gè)返回值.* 偶們雖然在C+中定義了average()函數(shù), 但偶們的Lua程序并不知道, 所以需要在main函數(shù)中加入 /* register our function */lua_register(L, "average", average);這兩行的作用就是告訴e15.lua有average()這樣一個(gè)函數(shù).* 這個(gè)程序可以存成cpp也可以存成c, 如果以.c為擴(kuò)展名就不需要加extern "C"編譯的方法偶們上次說(shuō)過(guò)了, 方法相同.e15.lua執(zhí)行的方法只能用上例中的C+中執(zhí)行, 而不能用命令行方式執(zhí)行.3.錯(cuò)誤處理
40、在上例中, 偶們沒(méi)有對(duì)傳入的參數(shù)是否為數(shù)字進(jìn)行檢測(cè), 這樣做不好. 所以這里偶們?cè)偌由襄e(cuò)誤處理的片斷.把這段加在for循環(huán)之內(nèi):if (!lua_isnumber(L, i) lua_pushstring(L, "Incorrect argument to 'average'");lua_error(L);這段的作用就是檢測(cè)傳入的是否為數(shù)字.加上這段之后, 偶們debug的時(shí)候就會(huì)簡(jiǎn)單許多. 對(duì)于結(jié)合兩種語(yǔ)言的編程, 它們之間傳遞數(shù)據(jù)的正確性檢測(cè)是非常重要的. 這里有別人寫(xiě)好的例子:VC的 Linux的 LuaPlus: 好用的Lua For C+擴(kuò)展(修訂
41、) LuaPlus是Lua的C+增強(qiáng),也就是說(shuō),LuaPlus本身就是在Lua的源碼上進(jìn)行增強(qiáng)得來(lái)的。用它與C+進(jìn)行合作,是比較好的一個(gè)選擇。LuaPlus目前版本為:LuaPlus for Lua 5.01 Distribution Build 1080 (February 28, 2004)。大家可以到/ 站點(diǎn)下載:源碼 (目標(biāo)碼 (我將在下面說(shuō)明,如何使用LuaPlus,以及如何更方便的讓LuaPlus與C+的類(lèi)合作無(wú)間。1. 調(diào)用Lua腳本 / 創(chuàng)建Lua解釋器
42、: LuaStateOwner state; / 執(zhí)行Lua腳本: state->DoString("print('Hello Worldn')"); / 載入Lua腳本文件并執(zhí)行: state->DoFile("
43、;C:test.lua"); / 載入編譯后的Lua腳本文件并執(zhí)行: state->DoFile("C:test.luac");2. 與Lua腳本互相調(diào)用 / 為L(zhǎng)ua腳本設(shè)置變量 state->GetGlobals().SetNumber("myvalue", 123456);
44、0;/ 獲得Lua變量的值 int myvalue = state->GetGlobal("myvalue").GetInteger(); / 調(diào)用Lua函數(shù) LuaFunction<int> luaPrint = state->GetGlobal("print");&
45、#160; luaPrint("Hello Worldn"); / 讓Lua調(diào)用C語(yǔ)言函數(shù) int add(int a, int b) return a+b; state->GetGlobals().RegisterDirect("add",
46、add); state->DoString("print(add(3,4)"); / 讓Lua調(diào)用C+類(lèi)成員函數(shù) class Testpublic: int add(int a, int b)return a+b; Test test;
47、160; state->GetGlobals().RegisterDirect("add", test, &Test:add); state->DoString("print(add(3,4)"); 3. 在Lua腳本中使用C+類(lèi) 這個(gè)稍微有點(diǎn)小麻煩。不過(guò),我包裝了一個(gè)LuaPlusHelper.h的文件,它可以很輕松的完成這個(gè)工作。它的實(shí)
48、現(xiàn)也很簡(jiǎn)單,大家可以從源碼上來(lái)獲得如何用純LuaPlus實(shí)現(xiàn)同樣的功能。 不過(guò),這里仍然有一個(gè)限制沒(méi)有解決:不能使用虛成員函數(shù)。不過(guò)考慮到我們僅是在Lua調(diào)用一下C+函數(shù),并不是要將C+完美的導(dǎo)入到Lua,這個(gè)限制完全可以接受。 另外,類(lèi)成員變量不能直接在Lua中訪問(wèn),可以通過(guò)類(lèi)成員函數(shù)來(lái)訪問(wèn)(比如SetValue/GetValue之類(lèi))。 / 下面是一個(gè)簡(jiǎn)單的C+類(lèi): class Logger public:
49、160; void LOGMEMBER(const char* message) printf("In member function: %sn", message); Logger() printf("Constructing(%p)n", this); v&
50、#160;= 10; virtual Logger() printf("Destructing(%p)n", this); Logger(int n) printf(" - Constructing%d(%p)n", n, this);
51、 Logger(Logger* logger) printf(" - Constructing%p(%p)n", logger, this); logger->LOGMEMBER(" Call From Constructorn"); int SetValue(int val)
52、160; v = val; int GetValue() return v; public: int v; / 導(dǎo)入到Lua腳本: LuaClass<Logger>(state)
53、160; .create("Logger") / 定義構(gòu)造函數(shù) Logger:Logger() .create<int>("Logger2") / 定義構(gòu)造函數(shù) Logger:Logger(int) .create<Logger*>("Logger3&qu
54、ot;) / 定義構(gòu)造函數(shù) Logger:Logger(Logger*) .destroy("Free") / 定義析構(gòu)函數(shù) Logger:Logger() .destroy("_gc") / 定義析構(gòu)函數(shù) Logger:Logger()
55、0; .def("lm", &Logger:LOGMEMBER) / 定義成員函數(shù) Logger:LOGMEMBER(const char*) .def("SetValue", &Logger:SetValue) .def("GetValue",
56、0;&Logger:GetValue); / 在Lua中使用Logger類(lèi)(1): state->DoString( "l = Logger();" / 調(diào)用構(gòu)造函數(shù) Logger:Logger() &
57、quot;l:lm('Hello World 1');" / 調(diào)用成員函數(shù) Logger:LOGMEMBER(const char*) "l:Free();" / 調(diào)用析構(gòu)函數(shù) Logger:Logger() ); &
58、#160; / 在Lua中使用Logger類(lèi)(2): state->DoString( "m = Logger2(10);" / 調(diào)用構(gòu)造函數(shù) Logger:Logger(int) "m:lm('Hello World 2'
59、);" / 調(diào)用成員函數(shù) Logger:LOGMEMBER(const char*) "n = Logger3(m);" / 調(diào)用構(gòu)造函數(shù) Logger:Logger(Logger*) "n:lm('Hello World 3');&
60、quot; / 調(diào)用成員函數(shù) Logger:LOGMEMBER(const char*) "m:SetValue(11);" "print(m.GetValue();" "m,n = nil,
61、160;nil;" / m,n 將由Lua的垃極回收來(lái)調(diào)用析構(gòu)函數(shù) );4. 將一組C函數(shù)歸類(lèi)到Lua模塊 /同上面一樣,我采用LuaPlusHelper.h來(lái)簡(jiǎn)化: LuaModule(state, "mymodule") .def("a
62、dd", add) .def("add2", test, add); state->DoString( "print(mymodule.add(3,4);" "print(my
63、module.add2(3,4);" );5. 使用Lua的Table數(shù)據(jù)類(lèi)型 / 在Lua中創(chuàng)建Table LuaObject table = state->GetGlobals().CreateTable("mytable"); table.SetInteger("m", 10);
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 療養(yǎng)補(bǔ)充合同范本
- 2024年12月河北邯鄲邱縣黨群系統(tǒng)事業(yè)單位工作人員20名筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解-1
- 蘇教版五年級(jí)科學(xué)下冊(cè)第一單元第2課《微小的生命體》課件
- 科學(xué)飲食與職場(chǎng)健康
- 舟山酒店暖通工程施工方案
- 團(tuán)島到鳳凰島地鐵施工方案
- 南京傳媒學(xué)院《形體舞蹈I》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東工程職業(yè)技術(shù)學(xué)院《先進(jìn)感知技術(shù)與物聯(lián)網(wǎng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古機(jī)電職業(yè)技術(shù)學(xué)院《大設(shè)計(jì)(二)環(huán)境視覺(jué)設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 中國(guó)科學(xué)技術(shù)大學(xué)《室內(nèi)空間軟裝飾》2023-2024學(xué)年第二學(xué)期期末試卷
- 《走近世界民間美術(shù)》 課件 2024-2025學(xué)年人美版(2024)初中美術(shù)七年級(jí)下冊(cè)
- 2025云南紅河州個(gè)舊市大紅屯糧食購(gòu)銷(xiāo)限公司招聘及人員高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- X證書(shū)失智老年人照護(hù)講解
- 工廠安全事故預(yù)防知識(shí)
- 2024-2025學(xué)年人教版數(shù)學(xué)八年級(jí)下冊(cè)期中檢測(cè)卷(含答案)
- 2024年江西應(yīng)用工程職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 中醫(yī)護(hù)理技術(shù)操作質(zhì)量控制
- 6月26國(guó)際禁毒日防范青少年藥物濫用禁毒宣傳課件
- 老舊小區(qū)基礎(chǔ)設(shè)施環(huán)境改造工程施工質(zhì)量因素的分析及控制方法
- 筑牢安全防線(xiàn)守護(hù)平安校園
-
評(píng)論
0/150
提交評(píng)論