基於vs的lua原始碼,位址為
lua作為小巧精悍的指令碼語言,易於嵌入c/c++中 , 廣泛應用於遊戲ai ,實際上在任何經常變化的邏輯上都可以使用lua實現,配合c/c++實現的底層介面服務,能夠大大降低系統的維護成本。下面對lua和c/c++的互動呼叫做乙個例項分析:
lua提供了api用於在c/c++中構造lua的執行環境,相關介面如下:
//建立lua執行上下文
lua_state* lual_newstate(void) ;
//載入lua指令碼檔案
int lual_loadfile(lua_state *l, const char *filename);
lua和c/c++的資料互動通過"棧"進行 ,運算元據時,首先將資料拷貝到"棧"上,然後獲取資料,棧中的每個資料通過索引值進行定位,索引值為正時表示相對於棧底的偏移索引,索引值為負時表示相對於棧頂的偏移索引,索引值以1或-1為起始值,因此棧頂索引值永遠為-1 ,棧底索引值永遠為1 。 "棧"相當於資料在lua和c/c++之間的中轉地。每種資料都有相應的訪問介面 。
資料入"棧"介面:
void (lua_pushnil) (lua_state *l);
void (lua_pushnumber) (lua_state *l, lua_number n);
void (lua_pushinteger) (lua_state *l, lua_integer n);
void (lua_pushlstring) (lua_state *l, const char *s, size_t l);
void (lua_pushstring) (lua_state *l, const char *s);
void (lua_pushboolean) (lua_state *l, int b);
void (lua_pushcclosure) (lua_state *l, lua_cfunction fn, int n);
資料獲取介面:
lua_number (lua_tonumber) (lua_state *l, int idx);
lua_integer (lua_tointeger) (lua_state *l, int idx);
int (lua_toboolean) (lua_state *l, int idx);
const char *(lua_tolstring) (lua_state *l, int idx, size_t *len);
lua_cfunction (lua_tocfunction) (lua_state *l, int idx);
「棧」操作介面
int (lua_gettop) (lua_state *l);
void (lua_settop) (lua_state *l, int idx);
void (lua_pushvalue) (lua_state *l, int idx);
void (lua_remove) (lua_state *l, int idx);
void (lua_insert) (lua_state *l, int idx);
void (lua_replace) (lua_state *l, int idx);
int (lua_checkstack) (lua_state *l, int sz);
void (lua_gettable) (lua_state *l, int idx);
void (lua_getfield) (lua_state *l, int idx, const char *k);
void (lua_settable) (lua_state *l, int idx);
void (lua_setfield) (lua_state *l, int idx, const char *k);
當"棧"中包含執行指令碼需要的所有要素(函式名和引數)後,呼叫lua_pcall執行指令碼:
int (lua_pcall) (lua_state *l, int nargs, int nresults, int errfunc);
下面進行例項說明
func.lua
width=1 ;
height=2 ;
--lua函式定義,實現加法
function sum(a,b)
return a+b ;
end--lua函式定義,實現字串相加
function mystrcat(a,b)
return a..b ;
end--lua函式定義,通過呼叫c**中的csum函式實現加法
function mysum(a,b)
return csum(a,b) ;
end
test_lua.c
#include #include #include #include //lua標頭檔案
#include #include #include #define err_exit(num,fmt,args) \
do while(0)
#define err_return(num,fmt,args) \
do while(0)
//lua中呼叫的c函式定義,實現加法
int csum(lua_state* l)
int main(int argc,char** argv)
部分**:
Lua與C C 的互動
lua 從 取得 luatinker 可以從 取得 tolua 可以從 取得 關於lua與c c 的互動 c c 呼叫lua的函式還是比較簡單的,可以參考lua tinker的實現。lua呼叫c c 的函式如果用最原始的方式有很大限制,只能呼叫型別為 typedef int lua cfunctio...
Lua與C C 互動函式問題
初學lua,遇到註冊c c 互動函式問題 在lua與c c 互動時,c c 的註冊lua函式若是乙個有返回型別 壓棧 而不是獲取型別的時候應該返回1而不是返回0,否則會出現在lua中值為nil 空 不太明白為什麼事這樣,如果有知道的大神,麻煩講解下 如 應該是 1 2 3 4 5 6 intcrea...
Lua與VC的互動
1 從c讀取lua檔案 lua state l lual newstate luaopen base l int ret lual dofile l,111.lua console writeline open ret n ret lua resume l,0 2 讀取乙個單獨的變數 111.lua...