資料交換介紹
lua和c程式通過乙個堆疊交換資料: struct lua_state
堆疊的序號可以從棧頂和棧底計數,從棧底計數,則棧底是1,向棧頂方向遞增。從棧頂計數,則棧頂是-1,向棧底方向遞減。一般都用從棧頂計數的方式。堆疊的預設大小是20,可以用lua_checkstack修改.用lua_gettop則可以獲得棧裡的元素數目。並不是說在棧頂有乙個整形元素。而是計算了一下棧頂元素在棧裡的正index,相當於元素數目。
lua 呼叫c函式用的堆疊是臨時的,呼叫結束之後就被銷毀了。
如何從堆疊中獲取從lua指令碼中的引數
如果知道lua指令碼中某個全域性變數的名字,可以用void lua_getglobal (lua_state *l, const char *name) 。這個函式會將name所指lua變數的值放在棧頂.
如果是在c 函式中要獲取lua呼叫函式使用的引數:
首先用lua_gettop檢查引數數量
用lua_is...類函式檢測引數的型別,做好錯誤處理
用lua_to...類函式將引數轉換為number或者string.(對lua來說,只有這兩種簡單型別)
lua_tonumber返回的是double
lua_tostring返回的是char*
用lua_remove從棧中刪除掉元素
繼續獲取下乙個元素. 因為每次都呼叫lua_remove,所以每次呼叫lua_tonumber,使用的index都將固定是-1,即棧頂。
如果lua_istable成立,那麼說明棧頂是乙個table.注意table是不能取出來的,只能把table裡的元素乙個個取出來。
首先把元素的名字壓入棧頂: lua_pushstring(l,"i");然後就可以用lua_gettable呼叫,值會放在棧頂。同時剛才壓入的元素名字被彈出。用上面的辦法,可以把這個值取出來。記得也應該lua_remove。 如果table的某乙個元素也是table,重複即可。當table的所有元素都取完了,記住這個table本身還在堆疊裡,要用lua_remove把它刪除。
如果要獲取的是乙個陣列(所謂陣列,其實就是key是從1開始的數字序列的table,並且值型別相同),用lua_next可以遍歷這個陣列:
首先lua_pushnil,壓入乙個空值,然後
while (lua_next(l, -2) != 0)}lua_remove(l,-1);//刪除nil
如何從c返回資料給lua指令碼
用lua_push...類函式壓入資料到堆疊中,並用return n;來告訴lua返回了幾個返回值。 lua是天生支援多個返回值的,如 x,y = test()。 lua會根據n從棧裡取相應的資料。
如果要返回乙個table:
lua_newtable(l);//建立乙個**,放在棧頂 lua_pushstring(l, "mydata");//壓入key lua_pushnumber(l,66);//壓入value lua_settable(l,-3);//彈出key,value,並設定到table裡面去 lua_pushstring(l, "subdata");//壓入key lua_newtable(l);//壓入value,也是乙個table lua_pushstring(l, "mydata");//壓入subtable的key lua_pushnumber(l,53);//value lua_settable(l,-3);//彈出key,value,並設定到subtable lua_settable(l,-3);//這時候父table的位置還是-3,彈出key,value(subtable),並設定到table裡去 lua_pushstring(l, "mydata2");//同上 lua_pushnumber(l,77); lua_settable(l,-3); return 1;//堆疊裡現在就乙個table.其他都被彈掉了。如果要返回乙個陣列,用如下**:(注意那個關於trick的注釋,我在等官方的解釋。經過驗證,這個問題只在windows版本呼叫dll中方法的時候出現。wince正常)
lua_pushstring(l,"arri"); lua_newtable(l); } lua_settable(l,-3);這樣產生的陣列可以在lua中如下遍歷:
for i,v in ipairs(data.arri) do
print(v)
end或者是
for i=1,table.getn(data.arri) do
print(data.arri)
end只有陣列才能這樣,name,value構成的record不行,table.getn也只對陣列有效。
由於上述**的高度相似性,所以很容易實現自動生成這些**。比如,根據c的乙個struct定義:
typedef enum baudrate;typedef struct flagflag;可以自動產生如下**:
bool datatolua(flag data,lua_state *l)luatodata也是類似的。
如果使用物件導向的方式封裝起flag來,把datatolua變成flag類的乙個方法,就更加方便了。
第乙個c 呼叫Lua程式
main.cpp include include include include int main lua close l return 0 pro config console config qt sources main.cpp libs usr lib x86 64 linux gnu lib...
第乙個Lua程式
2006 10 29 lua測試指令碼 在編寫第乙個lua程式之前,我們先編寫乙個.lua指令碼以供呼叫,如下 test.lua test.lua print hello lua 其中,兩個連續的減號意味著這是一行注釋。我們期望執行這個.lua指令碼的結果是在螢幕上列印一串 hello lua 的字...
通過C 開啟乙個應用程式
system.diagnostics.processstartinfo info new system.diagnostics.processstartinfo 設定外部程式名 info.filename eclipse.exe 設定外部程式工作目錄為 c info.workingdirectory...