成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Lua和C之間關于數據交換問題解決方案

移動開發 iOS
Lua和C之間關于數據交換問題解決方案是本文要介紹的內容,主要來了解并學習關于LUA和C++中數據交換的問題,來看本文詳解。

Lua和C之間關于數據交換問題解決方案是本文要介紹的內容,主要來了解并學習關于LUAC++數據交換的問題,來看本文詳解。

數據交換介紹

1、Lua和C程序通過一個堆棧交換數據: struct lua_State

2、堆棧的序號可以從棧頂和棧底計數,從棧底計數,則棧底是1,向棧頂方向遞增。從棧頂計數,則棧頂是-1,向棧底方向遞減。一般都用從棧頂計數的方式。堆棧的默認大小是20,可以用lua_checkstack修改.用lua_gettop則可以獲得棧里的元素數目。并不是說在棧頂有一個整形元素。而是計算了一下棧頂元素在棧里的正index,相當于元素數目。

3、Lua 調用C函數用的堆棧是臨時的,調用結束之后就被銷毀了。

4、如何從堆棧中獲取從Lua腳本中的參數

(1)如果知道Lua腳本中某個全局變量的名字,可以用void lua_getglobal (lua_State *L, const char *name) 。這個函數會將name所指Lua變量的值放在棧頂.

(2)如果是在C 函數中要獲取Lua調用函數使用的參數:

1、首先用lua_gettop檢查參數數量

2、用lua_is...類函數檢測參數的類型,做好錯誤處理

3、用lua_to...類函數將參數轉換為number或者string.(對Lua來說,只有這兩種簡單類型)

lua_tonumber返回的是double

lua_tostring返回的是char*

4、用lua_remove從棧中刪除掉元素

5、繼續獲取下一個元素. 因為每次都調用lua_remove,所以每次調用lua_tonumber,使用的index都將固定是-1,即棧頂。

6、如果lua_istable成立,那么說明棧頂是一個table.注意table是不能取出來的,只能把table里的元素一個個取出來。

首先把元素的名字壓入棧頂: lua_pushstring(L,"i"); 然后就可以用lua_gettable調用,值會放在棧頂。同時剛才壓入的元素名字被彈出。用上面的辦法,可以把這個值取出來。記得也應該lua_remove。 如果table的某一個元素也是table,重復即可。當table的所有元素都取完了,記住這個table本身還在堆棧里,要用lua_remove把它刪除。

7、如果要獲取的是一個數組(所謂數組,其實就是key是從1開始的數字序列的table,并且值類型相同),用lua_next可以遍歷這個數組:

首先lua_pushnil,壓入一個空值,然后

  1.  while (lua_next(L, -2) != 0)  
  2. {  
  3. if(lua_isnumber(L,-1)) //判斷元素類型,也可能是string  
  4. {  
  5. arrf.add((float)lua_tonumber(L, -1));//獲取元素的值  
  6.  
  7.          lua_remove(L,-1);  
  8. }  
  9. }  
  10. lua_remove(L,-1);//刪除NIL5.如何從C返回數據給Lua腳本 

用lua_push...類函數壓入數據到堆棧中,并用return n;來告訴Lua返回了幾個返回值。 Lua是天生支持多個返回值的,如 x,y = Test()。 Lua會根據n從棧里取相應的數據。

如果要返回一個table:

  1. lua_newtable(L);//創建一個表格,放在棧頂  
  2.  
  3. lua_pushstring(L, "mydata");//壓入key  
  4. lua_pushnumber(L,66);//壓入value  
  5. lua_settable(L,-3);//彈出key,value,并設置到table里面去  
  6.  
  7.      lua_pushstring(L, "subdata");//壓入key  
  8. lua_newtable(L);//壓入value,也是一個table  
  9. lua_pushstring(L, "mydata");//壓入subtable的key  
  10. lua_pushnumber(L,53);//value  
  11. lua_settable(L,-3);//彈出key,value,并設置到subtable  
  12. lua_settable(L,-3);//這時候父table的位置還是-3,彈出key,value(subtable),并設置到table里去  
  13.  
  14. lua_pushstring(L, "mydata2");//同上  
  15. lua_pushnumber(L,77);  
  16. lua_settable(L,-3); 

 return 1;//堆棧里現在就一個table.其他都被彈掉了。
 
 如果要返回一個數組,用如下代碼:(注意那個關于trick的注釋,我在等官方的解釋。經過驗證,這個問題只在windows版本調用dll中方法的時候出現。WinCE正常)

  1. lua_pushstring(L,"arri");  
  2. lua_newtable(L);  
  3. {  
  4. //a trick:otherwise the lua engine will crash. This element is invisible in Lua script  
  5. lua_pushnumber(L,-1);  
  6. lua_rawseti(L,-2,0);  
  7. for(int i = 0; i < arri.size();i++)  
  8. {  
  9. lua_pushnumber(L,arri[i]);  
  10. lua_rawseti(L,-2,i+1);  
  11. }  

lua_settable(L,-3);這樣產生的數組可以在Lua中如下遍歷:

  1. for i,v in ipairs(data.arri) do  
  2. print(v)  
  3. end  
  4.  
  5. 或者是  
  6.  
  7. for i=1,table.getn(data.arri) do  
  8. print(data.arri[i])  
  9. end 

只有數組才能這樣,name,value構成的Record不行,table.getn也只對數組有效。

8、由于上述代碼的高度相似性,所以很容易實現自動生成這些代碼。比如,根據C的一個struct定義:

  1. typedef enum  
  2. {  
  3. BR_9600,  
  4. BR_4800,  
  5. } BaudRate;  
  6.  
  7. typedef struct flag  
  8. {  
  9. int onoff;  
  10. int j;  
  11. long l;  
  12. double d;  
  13. char* name;  
  14. BaudRate rate;  
  15. }flag; 

可以自動產生如下代碼:

  1. bool DataToLua(flag data,lua_State *L)  
  2. {  
  3. lua_newtable(L);  
  4. lua_pushstring(L,"onoff");  
  5. lua_pushnumber(L,(double)data.onoff);  
  6. lua_settable(L,-3);  
  7. lua_pushstring(L,"j");  
  8. lua_pushnumber(L,(double)data.j);  
  9. lua_settable(L,-3);  
  10. lua_pushstring(L,"l");  
  11. lua_pushnumber(L,(double)data.l);  
  12. lua_settable(L,-3);  
  13. lua_pushstring(L,"d");  
  14. lua_pushnumber(L,(double)data.d);  
  15. lua_settable(L,-3);  
  16. lua_pushstring(L,"name");  
  17. lua_pushstring(L,data.name.c_str());  
  18. lua_settable(L,-3);  
  19. lua_pushstring(L,"rate");  
  20. lua_pushnumber(L,(double)(int)data.rate);  
  21. lua_settable(L,-3);  
  22. return true;  

LuaToData也是類似的。

如果使用面向對象的方式封裝起flag來,把DataToLua變成flag類的一個方法,就更加方便了。

小結:Lua和C之間關于數據交換問題解決方案的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2010-02-06 14:54:11

C++指針漂移

2012-05-09 10:08:41

跨機房

2010-05-20 13:48:17

IIS服務器

2010-03-30 16:04:34

Linux Nginx

2010-09-27 13:14:42

JVM內存限制

2010-02-23 17:49:56

WCF傳輸大數據

2010-02-05 09:56:04

三層交換機

2009-12-24 11:13:41

2010-10-08 13:09:38

JavaScript數

2010-05-31 12:53:56

Nagios apac

2011-03-23 16:38:28

LAMP

2010-04-28 19:24:17

Hp unix

2009-03-18 09:26:23

Winform多線程C#

2010-08-04 10:20:30

Flex組件開發

2010-10-09 12:58:59

JS腳本兼容

2010-09-07 09:08:03

DIV彈出層

2010-04-06 09:33:37

CentOS系統

2021-01-13 10:18:29

SocketNetty粘包

2010-02-24 10:55:01

WCF跨域訪問

2010-05-04 11:30:29

Oracle漢字長度
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品国产偷自在线观看 | 欧美日韩免费一区二区三区 | 国产成人精品久久二区二区91 | 午夜精品视频一区 | 欧美一区二不卡视频 | 欧美精品三区 | 97偷拍视频 | 亚洲精品乱码久久久久久按摩 | 中文字幕不卡一区 | 精品国产一区三区 | 久久夜色精品国产 | 正在播放国产精品 | 草久久久 | 久久99网 | 国产精品国产精品国产专区不片 | 日韩精品专区在线影院重磅 | 日韩高清在线 | 国产精品综合一区二区 | 97综合在线 | 日韩一区精品 | 噜噜噜噜狠狠狠7777视频 | 日本一区二区三区精品视频 | 日韩电影在线 | 日韩成人在线观看 | 国产精品免费一区二区 | 免费国产一区二区 | 亚洲www | 欧美一级片在线 | 自拍偷拍3p | 午夜在线视频 | 久久久久国产精品一区二区 | 精品欧美在线观看 | 成人精品国产 | 久久亚洲春色中文字幕久久久 | 91麻豆精品国产91久久久久久 | 日本不卡免费新一二三区 | 日韩免费三级 | 精品国产一级 | 久久精品一区二区视频 | 久久r免费视频 | 亚洲色图图片 |