1. 程式人生 > >lua與C交互關鍵函數

lua與C交互關鍵函數

const lua_next 素數 font con tab 成功 create 參數

1lua_next(L, t_idx)

參數解釋:

L:虛擬機

t_idxtable在棧中索引

返回

int0執行失敗;非0執行成功

該函數的執行流程為:

:先從棧頂彈出一個key

:從棧指定位置的table中取下一對key-value對,先將key入棧,再將value入棧;

:如果成功則返回非0值;否則返回0,並且不向棧中壓入任何值;

說明:第步中從table裏面取出"下一對key-value"值是相對於第步中彈出的key的,

table裏面第一對key-value前面沒有數據,所以先用lua_pushnil()

壓入一個nil值作為初始key

到了table中已經沒有key-value時,不會向棧中插入新的key-value對,這時lua_next()返回0

循環結束;

C裏面可以使用lua_gettable()lua_rawget()函數獲取表中數據,但是你事先需知曉索引名稱;

使用lua_next()的好處是,可以事先不知道這些信息;

----------------------------------------------------------------------------------------------------------

2

lua_gettable(L, t_idx)

參數解釋:

L:虛擬機

t_idxtable在棧中索引

函數執行流程為:

:取棧頂元素的值,以該值作為key,到t_idx指定的table中去取對應的value

:彈出key,並壓入取到的value


----------------------------------------------------------------------------------------------------------

3lua_getglobal(L, key)

參數

L:虛擬機

key:宿主程序想要獲取的變量的名稱

返回

void

執行流程:

:宿主會將名稱key置於棧的頂部,此時棧包含一個元素;

lua取得這個key後,清除棧中這個key(此時棧頂不包含元素),並到lua的全局表中查找這個key對應的value

:若全局表找到對應的value,將這個值壓入棧頂(宿主程序可以取用);若全局表未找到,壓入nil

----------------------------------------------------------------------------------------------------------

3lua_setglobal(L, key)

參數

L:虛擬機

key:宿主程序想要獲取的變量的名稱

返回

void

執行流程:

:宿主會將名稱key置於棧的頂部

lua取得這個key後,作為一個全局變量名,並到lua的全局表中查找這個key對應的value

:若全局表找到對應的value,將這個值壓入棧頂(宿主程序可以取用);若全局表未找到,壓入nil

----------------------------------------------------------------------------------------------------------

4lua_settop(L, idx)

參數解釋

L:虛擬機

idx:將棧指針移動到指定的索引位置,例如lua_settop(L, 0)常用來重置棧,這樣我們入棧的第一個信息就在idx=1的位置了

-----------------------------------------------------------------------------------------------------------

5lua_setfield(L, t_idx, key)

參數解釋:

L:虛擬機

t_idx:表在L棧中的索引

key:待設置鍵名稱

返回:

void

執行細節:

:取棧頂val

:根據t_idx的值,找到對應的表t,做 t[key]=val的操作;

:彈出棧頂val

------------------------------------------------------------------------------------------------------------

6lua_getfield(L, t_idx, key)

參數解釋:

L:虛擬機

t_idx:表在L棧中的索引

key:待取值的鍵名稱

返回:

void

執行細節:

:根據t_idx的值,找到對應的表t,取 val = t[key]

:將val壓入棧頂

------------------------------------------------------------------------------------------------------------

7?luaL_Reg

解釋:

typedef struct luaL_Reg {

? const char *name; ?// lua中函數的名稱

? lua_CFunction func; ?// 指向C中函數的函數指針

} luaL_Reg;

一個數組的類型,該數組會包含一些函數,這些函數會通過?luaL_setfuncs?()函數被註冊,

每一個luaL_Reg數組都必須用{NULL, NULL}來作為結尾的元素;

------------------------------------------------------------------------------------------------------------

8?lua_createtable(L, narr, nrec)

參數解釋:

L:虛擬機

narrTable中數組部分預分配元素數量

nrecTable中哈希部分預分配元素數量

返回:

void

執行細節:

:創建一個table,數組部分預分配narr個元素,哈希部分預分配nrec個元素

:將table壓入棧頂

------------------------------------------------------------------------------------------------------------

9??luaL_setfuncs(L, narr, nrec)

參數解釋:

L:虛擬機

narrTable中數組部分預分配元素數量

nrecTable中哈希部分預分配元素數量

返回:

void

執行細節:

:創建一個table,數組部分預分配narr個元素,哈希部分預分配nrec個元素

:將table壓入棧頂

------------------------------------------------------------------------------------------------------------

?

10??lua_pushcclosure(lua_State *L, lua_CFunction fn, int n)

?

參數解釋:

L:虛擬機

fnc函數

nc函數關聯的upvalues個數

返回:

void

執行細節:

:創建和壓入一個C閉包到棧頂

:關聯nupvalues到這個C閉包,首先這些upvalue必須被壓入棧中

:該函數調用結束後會彈出上面入棧的upvalue值,閉包不會被彈出;

------------------------------------------------------------------------------------------------------------

11??luaL_setfuncs(L, narr, nrec)

參數解釋:

L:虛擬機

narrTable中數組部分預分配元素數量

nrecTable中哈希部分預分配元素數量

返回:

void

執行細節:

:創建一個table,數組部分預分配narr個元素,哈希部分預分配nrec個元素

:將table壓入棧頂

------------------------------------------------------------------------------------------------------------

lua與C交互關鍵函數