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

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

  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 沛沛 閱讀(496) 評論(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>
            国产偷国产偷亚洲高清97cao| 红桃视频欧美| 一区二区三区免费在线观看| 亚洲黄网站黄| 欧美高清视频一区二区三区在线观看| 影音先锋欧美精品| 男人天堂欧美日韩| 欧美成年人网| 亚洲天堂男人| 亚洲午夜性刺激影院| 国产乱码精品一区二区三区忘忧草| 亚洲欧美国产一区二区三区| 羞羞色国产精品| 在线观看一区欧美| 亚洲激情偷拍| 国产精品永久免费观看| 久久精品国产一区二区三| 久久精品国产一区二区三区免费看 | 亚洲精品一区二区在线观看| 亚洲国产日韩欧美一区二区三区| 欧美成人免费播放| 亚洲欧美精品伊人久久| 欧美一区二区三区的| 在线观看欧美一区| 9久re热视频在线精品| 国产三级欧美三级日产三级99| 久久午夜羞羞影院免费观看| 欧美黑人在线播放| 久久国产精品72免费观看| 老司机精品视频一区二区三区| 日韩一区二区精品| 欧美一区二区三区四区夜夜大片| 在线成人欧美| 亚洲视频导航| 亚洲欧洲精品一区二区三区不卡 | 亚洲国产精品一区二区三区| 国产精品人人爽人人做我的可爱 | 久久精品一区二区国产| 免费成人性网站| 亚洲欧美日韩综合国产aⅴ| 久久久噜噜噜久久| 亚洲在线观看免费视频| 另类av一区二区| 久久国产精品久久久| 欧美成人在线免费视频| 久久精品亚洲一区二区三区浴池| 欧美精品免费在线观看| 欧美gay视频激情| 国产免费成人av| 亚洲精品在线免费| 1769国产精品| 欧美在线播放一区二区| 亚洲视频一区二区在线观看 | 一区二区三区成人精品| 亚洲国产精品va在线看黑人动漫| 亚洲男人第一av网站| 中日韩美女免费视频网址在线观看 | 亚洲丶国产丶欧美一区二区三区| 国产精品永久| 亚洲一区三区电影在线观看| 中文在线不卡视频| 欧美成人精品激情在线观看| 毛片基地黄久久久久久天堂| 国产亚洲一区二区三区在线观看| 亚洲视频在线观看| 一区二区三区欧美日韩| 欧美激情综合亚洲一二区| 欧美福利视频一区| 亚洲国产精品视频一区| 玖玖视频精品| 欧美激情无毛| 亚洲人成啪啪网站| 欧美国产成人在线| 亚洲人成在线观看| 在线亚洲精品| 欧美视频在线看| 在线亚洲欧美视频| 欧美一区二区视频在线观看2020| 欧美性色视频在线| 亚洲在线国产日韩欧美| 亚洲欧美日韩在线高清直播| 国产欧美精品va在线观看| 西西人体一区二区| 美女网站在线免费欧美精品| 伊人成年综合电影网| 欧美不卡在线| 日韩一级成人av| 香蕉免费一区二区三区在线观看| 国产乱子伦一区二区三区国色天香| 亚洲欧美国产制服动漫| 久久人人爽人人爽爽久久| 在线看国产日韩| 欧美精品在线一区二区| 亚洲亚洲精品三区日韩精品在线视频 | 国产精品一区二区三区四区| 欧美一区二区黄| 欧美成人免费网| 一区二区三区日韩欧美精品| 国产精品网站在线播放| 久久综合给合| 一本色道久久精品| 麻豆精品精品国产自在97香蕉| 亚洲另类一区二区| 国产精品一区在线播放| 美女91精品| 亚洲一区二区三区免费视频| 久久夜色精品国产亚洲aⅴ| 亚洲日韩成人| 国产午夜精品一区理论片飘花 | 一本色道久久综合狠狠躁篇怎么玩| 久久国产乱子精品免费女 | 欧美国产视频一区二区| 中文在线资源观看视频网站免费不卡| 久久激情一区| 一区二区三区国产精华| 国产女优一区| 欧美三级电影网| 久久婷婷综合激情| 亚洲一区在线免费| 亚洲精品国偷自产在线99热| 久久久九九九九| 亚洲婷婷综合色高清在线| 亚洲国产精品999| 国产亚洲欧美日韩美女| 欧美日韩国产成人高清视频| 久久精品女人天堂| 亚洲欧美日韩一区| 亚洲午夜激情免费视频| 亚洲国产欧美一区二区三区久久| 欧美一区二区在线观看| 亚洲一区高清| 一本不卡影院| 亚洲日本激情| 在线电影一区| 一区二区三区在线视频播放| 国产精品久线观看视频| 欧美片在线播放| 欧美福利视频网站| 欧美1区3d| 欧美jizz19性欧美| 免费观看在线综合| 久久亚洲国产成人| 久久亚洲免费| 猫咪成人在线观看| 久久日韩粉嫩一区二区三区| 久久精品人人| 久久日韩精品| 欧美+日本+国产+在线a∨观看| 久久激情视频久久| 久久久久免费视频| 久久嫩草精品久久久精品| 久久久噜噜噜久噜久久| 久久视频在线视频| 久久中文字幕一区| 欧美成人视屏| 欧美日韩高清区| 欧美午夜不卡影院在线观看完整版免费| 欧美片在线观看| 欧美视频一区二区三区四区| 欧美视频免费| 国产亚洲精品久| 在线看片第一页欧美| 亚洲三级免费电影| 一区二区三区视频观看| 亚洲欧美国产日韩天堂区| 欧美诱惑福利视频| 麻豆精品精华液| 亚洲人成人77777线观看| 99在线热播精品免费| 亚洲一区二区免费在线| 久久国产福利| 牛牛影视久久网| 国产精品高清在线观看| 国产亚洲人成a一在线v站 | 欧美午夜在线观看| 国产日韩欧美在线视频观看| 在线日韩日本国产亚洲| 99精品免费| 久久av红桃一区二区小说| 老司机免费视频久久| 亚洲精品日韩欧美| 欧美一区二区三区在线视频| 麻豆成人综合网| 国产精品国产三级国产aⅴ浪潮| 国产视频一区免费看| 亚洲精品日产精品乱码不卡| 午夜亚洲视频| 欧美激情一区| 亚洲免费在线视频| 欧美激情在线观看| 激情欧美亚洲| 亚洲欧美怡红院| 欧美激情第1页| 亚洲欧美日韩精品综合在线观看| 免费短视频成人日韩| 国产日韩在线视频| 宅男在线国产精品| 欧美大片一区二区三区| 午夜精品久久久久久久99樱桃| 欧美久久成人|