看板 GameDesign 關於我們 聯絡資訊
Lua的一個很強大的功能就是可以用C語言擴充,這樣一來可以把工作量很大的運算 都用C語言完成,而Lua只要運用就好,除此之外有C語言就可以實現其它有的沒有的功能 讓Lua變得更強大 現在我們就來介紹Lua呼叫C語言的函式 ///////////////////////////////////////////////// #include <iostream> extern "C"{ #include <stdio.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> } static int SayHello(lua_State *pLua){ const char *Name = lua_tostring(pLua,1); // 取得堆疊底層第一個參數的Name std::string Hello = "Hello! "; Hello += Name; lua_pushstring(pLua, Hello.c_str()); // 推入回傳字串進堆疊 return 1; // 告訴Lua我們有一個回傳值 } int main (void) { // 開啟Lua lua_State *pLua = lua_open(); if(!pLua){ std::cerr << "Failed to open Lua"<< std::endl; return EXIT_FAILURE; } // 啟動函式庫 luaopen_base(pLua); luaopen_table(pLua); luaopen_string(pLua); luaopen_math(pLua); luaopen_io(pLua); lua_register(pLua,"SayHello",SayHello); // 這是下面那兩行的簡寫 //lua_pushcfunction(pLua, SayHello); //lua_setglobal(pLua, "SayHello"); int Result; // 載入Lua檔 Result = luaL_loadfile(pLua,"hello.lua"); if(Result){ std::cerr << "Failed to load file"<< std::endl; return EXIT_FAILURE; } // 執行整個Lua檔 Result =lua_pcall(pLua, 0, 0, 0); if(Result){ std::cerr << "Failed to run lua"<< std::endl; return EXIT_FAILURE; } lua_close(pLua); return 0; } ////////////////////////////////////////////////////// -- This is my second lua programming print(SayHello("Victor Lin")) ////////////////////////////////////////////////////// 這次我們只增加了一點點東西,這證明了要增加C語言的函式其實不難,首先 先從我們新增的函數來看 static int SayHello(lua_State *pLua){ const char *Name = lua_tostring(pLua,1); // 取得堆疊底層第一個參數的 Name std::string Hello = "Hello! "; Hello += Name; lua_pushstring(pLua, Hello.c_str()); // 推入回傳字串進堆疊 return 1; // 告訴Lua我們有一個回傳值 } 要給Lua使用的函數,回傳值都是int,接受的參數都是lua_State * 而參數和回傳值的部份,都是由Lua的堆疊操作來完成的 第一行 const char *Name = lua_tostring(pLua,1); 就是從Lua的參數堆疊裡 取最底層的第1個,如果數字改成2,就變成是數上來的第2個 除此之外,你可以改成-1 -2... 等等,負值的意思,例如-1就是取堆疊最上面的值 -2是最上面往下數1個的值,以此類推 而lua_toxxx的意思,是從堆疊中取出那個值,並且轉為xxx形態的意思 其它還有很多形態可以用,在這裡我就不多說了,因為官方網站都查得到 除此之外,還有一些確認傳來的值正不正確的函數,官網一樣也有資料可以查 中間是C語言運作的部份,接下來就是回傳值的時後,我們說過Lua是運用堆疊來操作 所以,要回傳值,只要把它們push到堆疊裡面就成了,而return 1;是告訴lua 我們有一個回傳值,會這麼說,就代表Lua可以回傳很多個值,你可以Push很多個值 然後return多少個值,Lua就會收到多少個值,但是這邊注意一下, 即然是用堆疊,就有空間大小的限制,依我看到的官方堆疊大小好像是20個 以一般的使用情況,20個是不會用完的,所以不用擔心,如果用完的話 那我想那應該要算你使用不當,當然,如果你有特殊需求,要改堆疊的大小的話 Lua的表頭檔裡面有常數可以修改,這個部份也比較深入,所以請自行參考官網 接下來是我們在主程式新增的程式碼 lua_register(pLua,"SayHello",SayHello); // 這是下面那兩行的簡寫 //lua_pushcfunction(pLua, SayHello); //lua_setglobal(pLua, "SayHello"); 是的,註冊一個C函數給Lua就是那麼簡單,我們發現可以有兩種寫法 這是因為Lua提供很多常用的功能以巨集的方式給我們使用,很多地方 只要你會好好使用Lua提供的簡寫方式,就可以省很多力氣 以上,今天的C函數呼叫的部份就到這裡 -- VICTOR工作室 | PTT遊戲設計版隆重開幕! | 不管是新手老手,程式美工音樂企劃.... URL : http://www.kinmen.info/vic/ | 都歡迎來遊戲設計版參與討論 XD | 戰略高手> C/C++ | GameTopics> Visual Basic 6.0 | GameDesign -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.116.65.59