青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

每天早晨叫醒你的不是鬧鐘,而是夢想

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  62 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

   在Lua中可以通過自定義類型的方式與C語言代碼更高效、更靈活的交互。這里我們通過一個簡單完整的示例來學習一下Lua中userdata的使用方式。需要說明的是,該示例完全來自于Programming in Lua。其功能是用C程序實現一個Lua的布爾數組,以提供程序的執行效率。見下面的代碼和關鍵性注釋。   

復制代碼
  1 #include <lua.hpp>   
2
#include <lauxlib.h>
3
#include <lualib.h>
4
#include <limits.h>
5

6
#define BITS_PER_WORD (CHAR_BIT * sizeof(int))
7
#define I_WORD(i) ((unsigned int)(i))/BITS_PER_WORD
8
#define I_BIT(i) (1 << ((unsigned int)(i)%BITS_PER_WORD))
9

10
typedef struct NumArray {
11
int size; 12 unsigned int values[1];
13
} NumArray;
14

15
extern "C" int newArray(lua_State* L)
16
{
17
//1. 檢查第一個參數是否為整型。以及該參數的值是否大于等于1.
18
int n = luaL_checkint(L,1);
19
luaL_argcheck(L, n >= 1, 1, "invalid size.");
20
size_t nbytes = sizeof(NumArray) + I_WORD(n - 1) * sizeof(int);
21
//2. 參數表示Lua為userdata分配的字節數。同時將分配后的userdata對象壓入棧中。
22
NumArray* a = (NumArray*)lua_newuserdata(L,nbytes);
23
a->size = n;
24
for (int i = 0; i < I_WORD(n - 1); ++i)
25
a->values[i] = 0;
26
//獲取注冊表變量myarray,該key的值為metatable。
27
luaL_getmetatable(L,"myarray");
28
//將userdata的元表設置為和myarray關聯的table。同時將棧頂元素彈出。
29
lua_setmetatable(L,-2);
30
return 1;
31
}
32

33
extern "C" int setArray(lua_State* L)
34
{
35
//1. Lua傳給該函數的第一個參數必須是userdata,該對象的元表也必須是注冊表中和myarray關聯的table。
36
//否則該函數報錯并終止程序。
37
NumArray* a = (NumArray*)luaL_checkudata(L,1,"myarray");
38
int index = luaL_checkint(L,2) - 1;
39
//2. 由于任何類型的數據都可以成為布爾值,因此這里使用any只是為了確保有3個參數。
40
luaL_checkany(L,3);
41
luaL_argcheck(L,a != NULL,1,"'array' expected.");
42
luaL_argcheck(L,0 <= index && index < a->size,2,"index out of range.");
43
if (lua_toboolean(L,3))
44
a->values[I_WORD(index)] |= I_BIT(index);
45
else
46
a->values[I_WORD(index)] &= ~I_BIT(index);
47
return 0;
48
}
49

50
extern "C" int getArray(lua_State* L)
51
{
52
NumArray* a = (NumArray*)luaL_checkudata(L,1,"myarray");
53
int index = luaL_checkint(L,2) - 1;
54
luaL_argcheck(L, a != NULL, 1, "'array' expected.");
55
luaL_argcheck(L, 0 <= index && index < a->size,2,"index out of range");
56
lua_pushboolean(L,a->values[I_WORD(index)] & I_BIT(index));
57
return 1;
58
}
59

60
extern "C" int getSize(lua_State* L)
61
{
62
NumArray* a = (NumArray*)luaL_checkudata(L,1,"myarray");
63
luaL_argcheck(L,a != NULL,1,"'array' expected.");
64
lua_pushinteger(L,a->size);
65
return 1;
66
}
67

68
extern "C" int array2string(lua_State* L)
69
{
70
NumArray* a = (NumArray*)luaL_checkudata(L,1,"myarray");
71
lua_pushfstring(L,"array(%d)",a->size);
72
return 1;
73
}
74

75
static luaL_Reg arraylib_f [] = {
76
{"new", newArray},
77
{NULL, NULL}
78
};
79

80
static luaL_Reg arraylib_m [] = {
81
{"set", setArray},
82
{"get", getArray},
83
{"size", getSize},
84
{"__tostring", array2string}, //print(a)時Lua會調用該元方法。
85
{NULL, NULL}
86
};
87

88
extern "C" __declspec(dllexport)
89
int luaopen_testuserdata(lua_State* L)
90
{
91
//1. 創建元表,并將該元表指定給newArray函數新創建的userdata。在Lua中userdata也是以table的身份表現的。
92
//這樣在調用對象函數時,可以通過驗證其metatable的名稱來確定參數userdata是否合法。
93
luaL_newmetatable(L,"myarray");
94
lua_pushvalue(L,-1);
95 //2. 為了實現面對對象的調用方式,需要將元表的__index字段指向自身,同時再將arraylib_m數組中的函數注冊到
96
//元表中,之后基于這些注冊函數的調用就可以以面向對象的形式調用了。
97
//lua_setfield在執行后會將棧頂的table彈出。
98
lua_setfield(L,-2,"__index");
99
//將這些成員函數注冊給元表,以保證Lua在尋找方法時可以定位。NULL參數表示將用棧頂的table代替第二個參數。
100 luaL_register(L,NULL,arraylib_m);
101 //這里只注冊的工廠方法。
102 luaL_register(L,"testuserdata",arraylib_f);
103 return 1;
104 }
復制代碼

  輕量級userdata: 
  之前介紹的是full userdata,Lua還提供了另一種輕量級userdata(light userdata)。事實上,輕量級userdata僅僅表示的是C指針的值,即(void*)。由于它只是一個值,所以不用創建。如果需要將一個輕量級userdata放入棧中,調用lua_pushlightuserdata即可。full userdata和light userdata之間最大的區別來自于相等性判斷,對于一個full userdata,它只是與自身相等,而light userdata則表示為一個C指針,因此,它與所有表示同一指針的light userdata相等。再有就是light userdata不會受到垃圾收集器的管理,使用時就像一個普通的整型數字一樣。

posted on 2014-02-17 17:50 沛沛 閱讀(495) 評論(0)  編輯 收藏 引用 所屬分類: Script
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品综合| 99热这里只有精品8| 羞羞色国产精品| 亚洲一区视频| 亚洲香蕉在线观看| 99pao成人国产永久免费视频| 亚洲电影av| 美女精品视频一区| 欧美激情亚洲另类| 亚洲国产精品电影| 亚洲毛片在线观看.| 亚洲精品在线免费| 亚洲综合国产激情另类一区| 欧美夜福利tv在线| 欧美 日韩 国产精品免费观看| 欧美激情一区二区在线| 欧美日韩在线观看一区二区三区| 国产精品av久久久久久麻豆网| 国产精品福利av| 国产综合婷婷| 亚洲毛片网站| 欧美一区二区视频97| 久久久视频精品| 亚洲精品在线电影| 久久99伊人| 欧美剧在线免费观看网站| 国产精品xvideos88| 一区二区三区在线视频播放| 亚洲精品一品区二品区三品区| 亚洲午夜精品视频| 久久久久国产精品厨房| 亚洲国产精品精华液网站| 99精品99| 狂野欧美激情性xxxx| 国产精品久久久久久久午夜| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产精品成人一区二区三区吃奶 | 国产精品高清免费在线观看| 国产无遮挡一区二区三区毛片日本| 好看不卡的中文字幕| 亚洲最新在线视频| 欧美电影免费观看高清完整版| 亚洲一区二区三区四区视频| 久久琪琪电影院| 国产精品久久久一区麻豆最新章节| 在线观看成人网| 亚洲一区激情| 亚洲日本国产| 久久精品一区二区三区中文字幕| 欧美成人精品在线观看| 国产性做久久久久久| 亚洲女人天堂av| 亚洲黄色性网站| 麻豆av福利av久久av| 精品999久久久| 欧美亚洲一区在线| 亚洲——在线| 国产精品麻豆成人av电影艾秋| 日韩视频在线免费观看| 亚洲福利视频一区| 久久久久综合网| 国产欧美日韩伦理| 午夜老司机精品| 亚洲视频电影在线| 欧美日韩中国免费专区在线看| 亚洲乱码国产乱码精品精天堂| 免费久久99精品国产自在现线| 午夜免费在线观看精品视频| 国产精品永久免费| 欧美资源在线观看| 久久久久久久性| 亚洲日本va午夜在线电影| 亚洲国产一区二区在线| 欧美精品自拍| 久久电影一区| 久久精品视频在线看| 揄拍成人国产精品视频| 欧美成人a∨高清免费观看| 久久在线播放| 一区二区三区 在线观看视| 99亚洲精品| 国产午夜精品一区理论片飘花 | av成人免费观看| 亚洲性色视频| 国产视频在线观看一区| 鲁大师成人一区二区三区| 久久色中文字幕| 亚洲最黄网站| 亚洲欧美一区二区三区极速播放| 国产精品区一区| 欧美α欧美αv大片| 欧美日韩国产页| 久久精品国产第一区二区三区最新章节 | 欧美视频在线观看| 欧美在线综合视频| 欧美韩日亚洲| 久久国产66| 欧美波霸影院| 久久不射电影网| 欧美成人蜜桃| 久久精品二区三区| 欧美成人高清视频| 久久国产欧美精品| 欧美日韩成人| 久久午夜视频| 国产精品久久久久天堂| 欧美不卡视频一区| 国产麻豆91精品| 亚洲精选久久| 亚洲国产成人久久| 亚洲欧美激情一区二区| 亚洲精品韩国| 久久久777| 亚洲免费在线观看| 欧美 日韩 国产精品免费观看| 欧美一区二区视频在线观看| 欧美xxx在线观看| 久久电影一区| 国产精品素人视频| 亚洲人成在线观看网站高清| 国外成人性视频| 亚洲一区二区在线| 亚洲午夜av电影| 欧美高清视频一二三区| 久久久久久久久久久成人| 国产精品福利片| 亚洲激情网站| 亚洲激情不卡| 乱中年女人伦av一区二区| 久久九九免费视频| 国产精品主播| 中文在线一区| 亚洲欧美日韩在线不卡| 欧美日韩精品一区二区在线播放 | 欧美日韩一二三区| 老司机午夜精品| 国产一区二区三区日韩| 亚洲欧美日韩第一区| 亚洲一区二区三区免费观看| 免费欧美电影| 亚洲高清视频在线观看| 美女日韩欧美| 蜜臀av一级做a爰片久久| 狠狠色2019综合网| 欧美在线一区二区三区| 欧美综合77777色婷婷| 国产日韩专区在线| 久久精品五月| 欧美黄色片免费观看| 在线精品视频一区二区| 久久亚洲私人国产精品va媚药 | 久久国产精品72免费观看| 国产麻豆日韩欧美久久| 亚洲影视在线| 久久都是精品| 在线观看福利一区| 狼人社综合社区| 最新日韩av| 亚洲欧美综合精品久久成人| 国产精品免费在线| 欧美专区一区二区三区| 亚洲成在线观看| 一区二区三区产品免费精品久久75| 欧美aaaaaaaa牛牛影院| 亚洲欧洲精品一区二区| 亚洲一区二区在线观看视频| 国产乱码精品1区2区3区| 欧美一区二区三区精品电影| 欧美国产第二页| 午夜视频在线观看一区二区| 激情av一区| 欧美日韩精品一区视频| 性感少妇一区| 亚洲精品日韩综合观看成人91| 香蕉av福利精品导航| 狠狠色狠狠色综合人人| 欧美精品一区二区三区蜜桃| 午夜久久99| 欧美激情一区二区三区高清视频 | 亚洲图片欧洲图片日韩av| 国产欧美日韩亚州综合| 欧美成人dvd在线视频| 日韩午夜免费| 久久综合影音| 午夜精品视频| 亚洲精品资源美女情侣酒店| 国产日韩欧美视频| 欧美理论电影在线播放| 久久精品成人一区二区三区蜜臀| 亚洲激情一区二区| 久久嫩草精品久久久精品| 亚洲免费视频中文字幕| 亚洲人成免费| 伊人影院久久| 国产伦精品一区二区三区照片91| 欧美精品18| 另类图片国产| 欧美一区二区在线免费观看| 一区二区三区三区在线| 亚洲人屁股眼子交8|