[程式] Lua教程 : 函數的使用
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
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章