這是我的lua系列教程的第二篇,本篇文章主要介紹c++和lua相互傳遞資料。如果你還不知道怎麼在c/c++裡面呼叫lua指令碼的話,請參考這篇文章. 本文主要介紹基本資料型別的傳遞,比如整形(int),字串(string)、數字(number)及bool值。
由於在上乙個教程裡面已經介紹過如何在c/c++裡面嵌入lua,所以這一節就簡單的介紹一下程式怎麼用,配置就略過啦。
1
lua_state *lua_state = lual_newstate();
1234567
891011
12
staticconst lual_reg lualibs =,,
};const lual_reg *lib = lualibs;
for(; lib->func != null; lib++)
1234567
891011
12
std::string scriptpath = fileutils::getinstance()->fullpathforfilename("hello.lua");int status = lual_loadfile(lua_state, scriptpath.c_str());
std::cout
<< " return: "
<< status << std::endl;
int result = 0;
if(status == lua_ok)
else
這裡我們使用的是lual_loadfile而不是之前的lual_dofile,其實lual_dofile只是乙個巨集定義:
12
#define lual_dofile(l, fn) \(lual_loadfile(l, fn) || lua_pcall(l, 0, lua_multret, 0))
我們先呼叫lual_loadfile可以判斷lua指令碼是否載入成功,然後再呼叫lua_pcall來執行lua指令碼。
首先,我們在hello.lua裡面定義乙個lua函式:
1234
-- add two numbersfunction add
( x, y )
return x + y
end
lua的函式定義是以function為keyword,然後以end結尾,同時它的引數是沒有形參型別的,另外,lua的函式可以返回多個值。不過我們這裡只返回了乙個值。
接下來,讓我們看看如果在c++程式裡面呼叫這個函式:
1234567
891011
1213
1415
16
intluaadd
(lua_state *lua_state , int x, int y)
然後,我們就可以在程式裡面呼叫它了:
1
std::cout<< "2 + 1= "
<< luaadd(lua_state,4,1)<注意這個方法呼叫要在lua_pcall呼叫之後。
首先,我們在hello.lua裡面定義乙個全域性變數
1myname = "子龍山人"然後我們在c++裡面訪問它:
1234
lua_getglobal(lua_state, "myname");std::string myname = lua_tostring(lua_state, -1);
lua_pop(lua_state, 1);
std::cout
<<"hello: "
這一次我們又是通過lua_getglobal來把myname這個全域性變數壓到lua棧,然後用lua_tostring來取這個值。
這次我們使用的是lua_setglobal來傳遞資料給lua:
12
lua_pushstring(lua_state, "world");lua_setglobal(lua_state, "myname");
這時,我們只要在hello.lua的最開始部分,呼叫print(myname)就可以列印傳遞進來的值了。
1234567
8910
lua_createtable(lua_state, 2, 0);lua_pushnumber(lua_state, 1);
lua_pushnumber(lua_state, 49);
// lua_settable(lua_state, -3);
lua_rawset(lua_state, -3);
lua_pushnumber(lua_state, 2);
lua_pushstring(lua_state, "life is a beach");
// lua_settable(lua_state, -3);
lua_rawset(lua_state, -3);
lua_setglobal(lua_state, "arg");
這裡我們傳遞了乙個table給lua,這個table為。lua table的索引是從1開始的,然後我們在lua指令碼裡面可以這樣子來訪問這個table:
123
for i=1,#arg doprint(" ", i, arg[i])
end
這裡的#arg是獲得table的長度,然後使用arg[i]來獲取table的索引i處的value。
首先是lua**:
1234
local temp =-- temp[1]=9
-- temp[2]="see you space cowboy!"
return temp,9,1
然後是c++**:
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
28
std::stringstream str_buf;while(lua_gettop(lua_state))
lua_pop(lua_state, 1);
std::cout
<< str_buf.str() << std::endl;
}
最後輸出結果為:
12345
[c++] values returned from the script:script returned the number: 1
script returned the number: 9
script returned a table
[c++] closing the lua state
在lua裡面return值的順序是table,9,1,而在c++裡面是倒過來的。因為我們是使用棧作為資料結構來傳遞資料,而棧是先進後出的。
Lua篇 C 和Lua相互傳遞資料
一.建立lua虛擬機器 為c 和lua互動提供了乙個虛擬棧 lua state lua state lual newstate 二.載入lua庫 int bret lual loadfile l,addr.lua 三.執行lua指令碼 附帶c c 呼叫lua函式 bret lua pcall l,0...
lua和c 相互呼叫
include include include include include extern c lua state l int luaadd lua state l,int x,int y extern int cl domylua lua state l extern int cl drawte...
Lua教程 C 嵌入Lua指令碼
讀後感悟 先講了環境了配置,然後著重講了c 中如何呼叫lua,適合入門。如果想學習語法,可以看 lua程式設計 雖然講的是lua5.1,但是很多語法還是可以學的。當你學會了最基本的c 與lua呼叫之後,就可以馬上學一些互動 了,而不是只是看書,那麼看了之後,你會很容易忘記的,之前我就是學習lua的時...