lua與C C 的互動

2021-06-20 04:37:50 字數 2871 閱讀 9846

基於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...