Lua教程 C 和Lua相互傳遞資料 2

2021-07-04 08:06:46 字數 3904 閱讀 1506

這是我的lua系列教程的第二篇,本篇文章主要介紹c++和lua相互傳遞資料。如果你還不知道怎麼在c/c++裡面呼叫lua指令碼的話,請參考這篇文章. 本文主要介紹基本資料型別的傳遞,比如整形(int),字串(string)、數字(number)及bool值。

由於在上乙個教程裡面已經介紹過如何在c/c++裡面嵌入lua,所以這一節就簡單的介紹一下程式怎麼用,配置就略過啦。

1

lua_state *lua_state = lual_newstate();

123

4567

891011

12

static

const lual_reg lualibs =,,

};const lual_reg *lib = lualibs;

for(; lib->func != null; lib++)

123

4567

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只是乙個巨集定義:

1

2

#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函式:

123

4

-- add two numbers

function add

( x, y )

return x + y

end

lua的函式定義是以function為keyword,然後以end結尾,同時它的引數是沒有形參型別的,另外,lua的函式可以返回多個值。不過我們這裡只返回了乙個值。

接下來,讓我們看看如果在c++程式裡面呼叫這個函式:

123

4567

891011

1213

1415

16

int

luaadd

(lua_state *lua_state , int x, int y)

然後,我們就可以在程式裡面呼叫它了:

1

std::cout

<< "2 + 1= "

<< luaadd(lua_state,4,1)<注意這個方法呼叫要在lua_pcall呼叫之後。

首先,我們在hello.lua裡面定義乙個全域性變數

1

myname = "子龍山人"

然後我們在c++裡面訪問它:

123

4

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:

1

2

lua_pushstring(lua_state, "world");

lua_setglobal(lua_state, "myname");

這時,我們只要在hello.lua的最開始部分,呼叫print(myname)就可以列印傳遞進來的值了。

123

4567

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:

1

23

for i=1,#arg do

print(" ", i, arg[i])

end

這裡的#arg是獲得table的長度,然後使用arg[i]來獲取table的索引i處的value。

首先是lua**:

123

4

local temp = 

-- temp[1]=9

-- temp[2]="see you space cowboy!"

return temp,9,1

然後是c++**:

123

4567

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;

}

最後輸出結果為:

123

45

[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的時...