要想在c中呼叫lua中的函式,按照之前方法,需要先找到函式所在的位置。於是我們需要呼叫 lua_getglobal這個函式,而實際上lua_getglobal這個函式又是如何找到name所在的位置呢?
我們先看這個函式的實現
lua_api int lua_getglobal
(lua_state *l,
const char *name)
繼續跟進會看到調了auxgetstr這個函式
/*
** get functions (lua -> stack)
*/static int auxgetstr
(lua_state *l,
const tvalue *t,
const char *k)
else
lua_unlock(l
);return
ttnov(l
->top -1)
;}
再看到luah_getstr這個函式
const tvalue *
luah_getstr
(table *t, tstring *key)
}
繼續往下看luah_getshortstr這個函式
/*
** search function for short strings
*/const tvalue *
luah_getshortstr
(table *t, tstring *key)
}}
終於我們知道了lua怎麼找到name的了,就是for迴圈。當定義的函式很少時,不會產生什麼呼叫延遲,但是如果定義的函式很多的時候,我們每次呼叫都需要遍歷去查詢,那麼速度一下子就降下來了。那麼我們如何增加查詢的速度呢?
lua給了我們lual_ref和lua_rawgeti這兩個函式來快速的註冊和查詢函式
我們現在lua中定義這個函式
function
startsearch
(start,end)
......
return
100end
在c中先找到他並把它註冊進lua的ref中
lua_getglobal(l
,"startsearch");
// 獲取函式,壓入棧中
int ref =
lual_ref(l
,lua_registryindex
);
之後的呼叫只需要使用ref就行了
lua_rawgeti(l
,lua_registryindex
,ref)
;lua_pushinteger(l
,(long)
267000000);
// 壓入第乙個引數
lua_pushinteger(l
,(long)
111000000);
// 壓入第二個引數
int iret =
lua_pcall(l
,2,1
,0);
// 呼叫函式,呼叫完成以後,會將返回值壓入棧中,2表示引數個數,1表示返回結果個數。
if(iret)
// 呼叫出錯
C C 中如何呼叫Python方法
c c 對python的呼叫層次可以分為三個層次,1 高層次的呼叫,2 純python呼叫,3 python方法的擴充套件 也就使向python輸出呼叫函式 這裡我主要討論 1 和 2 兩種方法.1 高層次的呼叫 這是最簡單的一種在c c 中呼叫python的方法.它直接的呼叫python提供的c呼...
快速掌握Lua 5 3 從Lua中呼叫C函式
a 1 程式主體在c中執行,c函式註冊到lua中。c呼叫lua,lua呼叫c註冊的函式,c得到函式的執行結果。2 程式主體在lua中執行,c函式作為庫函式供lua使用。第一種方式看起來很羅嗦,也很奇怪。既然程式主體執行在c中,而且最終使用的也是c中定義的函式,那麼為何要將函式註冊給lua,然後再通過...
C C 中關於main函式的呼叫和定義形式
在c和c 中是不同的,我們知道c語言比較寬鬆 靈活,而c 的目標就是改變c語言比較寬鬆的特點,實行了比較嚴格的做法,包括嚴格的型別檢查等等。實際上,在c語言中,main函式可被遞迴呼叫,而在c 標準中,main函式不可以被遞迴呼叫。這當然也不是標準 c c 裡面定義的東西!char envp 是某些...