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

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

  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 沛沛 閱讀(490) 評論(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>
            日韩性生活视频| 欧美另类专区| 国产精品美女久久久久aⅴ国产馆| 国产亚洲精品久久久久婷婷瑜伽| 久久久综合精品| 另类成人小视频在线| 久久青草久久| 亚洲国产欧美国产综合一区| 噜噜噜躁狠狠躁狠狠精品视频| 中文一区字幕| 国产亚洲精品资源在线26u| 国产在线精品成人一区二区三区| 一本色道久久综合狠狠躁篇的优点 | 亚洲欧美成人综合| 久久久久女教师免费一区| 久久久亚洲一区| 蜜桃av噜噜一区二区三区| 91久久极品少妇xxxxⅹ软件| 国产精品久久久久一区| 国产欧美亚洲精品| 欧美精品亚洲二区| 欧美中文在线观看国产| 日韩视频永久免费观看| 亚洲一区中文字幕在线观看| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品网红福利| 欧美不卡在线| 欧美视频免费| 欧美精品一区二区三区视频 | 久久久久国产精品一区| 亚洲一区二区黄| 亚洲高清视频的网址| 国产欧美精品一区aⅴ影院| 激情综合亚洲| 欧美午夜一区二区三区免费大片| 国产精品99久久久久久宅男| 亚洲电影自拍| 欧美国产三级| 久久久精品国产一区二区三区 | 毛片一区二区三区| 亚洲国产高清aⅴ视频| 中文av字幕一区| 影音先锋中文字幕一区| 欧美日韩午夜视频在线观看| 快射av在线播放一区| 欧美日韩国产一级片| 欧美另类综合| 伊人久久亚洲热| 欧美亚洲尤物久久| 亚洲视频中文| 欧美高清在线播放| 亚洲第一色在线| 久久一区二区三区四区| 久久精品123| 久久精品国产亚洲aⅴ| 国产欧美日韩亚洲一区二区三区| 欧美freesex交免费视频| 欧美亚洲在线观看| 亚洲精品国产精品乱码不99 | 久久精品在这里| 欧美午夜在线观看| 亚洲一级黄色片| 99精品视频一区二区三区| 亚洲视频你懂的| 欧美日韩一区二区在线| av成人黄色| 亚洲一区二区在线| 亚洲一区二区三区中文字幕 | 亚洲第一精品影视| 国产精品视频99| 一区二区三区日韩| 国产一区二区三区日韩| 国产精品99久久不卡二区| 日韩一级大片| 国产精品久久久久久五月尺| 国产欧美日韩一区二区三区在线观看 | 欧美高清在线视频| 欧美精品激情blacked18| 国语自产偷拍精品视频偷| 国产欧美一二三区| 国产色产综合产在线视频| 国内精品久久久久影院薰衣草| 在线欧美日韩| 欧美一区成人| 最近中文字幕日韩精品 | 欧美一区亚洲| 国产一区二区精品| 91久久综合亚洲鲁鲁五月天| 亚洲二区免费| 欧美日韩国产综合在线| 亚洲欧美另类综合偷拍| 蜜臀99久久精品久久久久久软件 | 亚洲性视频h| 欧美成在线观看| 在线视频你懂得一区二区三区| 久久综合久久综合久久综合| 91久久精品日日躁夜夜躁欧美 | 亚洲黄色成人久久久| 一区二区欧美日韩视频| 国产精品午夜久久| 狂野欧美一区| 一区二区三区黄色| 国语精品一区| 亚洲无限乱码一二三四麻| 在线观看国产成人av片| 一本大道久久a久久精品综合| 久久亚洲电影| 国产欧美日韩综合| 午夜视频在线观看一区二区| 亚洲欧美日韩国产精品| 久久精品国语| 西西人体一区二区| 欧美国产日韩一区二区在线观看| 国产一区二区高清| 99re国产精品| 美女黄网久久| 国产精品乱码| 欧美第一黄网免费网站| 国产精品自在欧美一区| 性伦欧美刺激片在线观看| 亚洲精品久久久久久久久| 国产亚洲在线观看| 一区二区三区欧美激情| 在线亚洲欧美视频| 欧美第十八页| 亚洲国产精品福利| 亚洲国产美女| 亚洲毛片在线观看.| 欧美剧在线免费观看网站| 美国十次成人| 亚洲电影免费| 噜噜噜91成人网| 亚洲专区一二三| 欧美日韩免费在线视频| 99re6热只有精品免费观看| 日韩午夜中文字幕| 夜夜爽www精品| 一区二区高清| 欧美视频你懂的| 99国产精品国产精品毛片| 亚洲视频精选在线| 国产精品二区二区三区| 久久人人爽人人爽| 国产亚洲美州欧州综合国| 久久久精品国产99久久精品芒果| 久久久精品日韩欧美| 日韩一区二区精品视频| 欧美大片免费观看| 亚洲视频在线看| 亚洲自拍偷拍麻豆| 亚洲一区二区少妇| 国产精品久久久久秋霞鲁丝 | 久久精品亚洲乱码伦伦中文| 国产欧美高清| 亚洲第一精品在线| 最新国产成人av网站网址麻豆| 亚洲天堂激情| 亚洲欧美国产精品va在线观看| 久久综合色婷婷| 亚洲国产日韩欧美在线99| 国产亚洲成精品久久| 欧美电影在线免费观看网站| 日韩一区二区精品| 国产欧美在线播放| 免费亚洲视频| 亚洲欧美日韩精品久久亚洲区 | 欧美女同视频| 鲁大师影院一区二区三区| 亚洲黄网站在线观看| 国产精品久久久久久久久久久久久久| 欧美91大片| 国产伦理一区| 亚洲黄色三级| 好吊色欧美一区二区三区视频| 亚洲欧美日韩国产精品| 久久躁日日躁aaaaxxxx| 欧美一区二区三区成人| 欧美a级一区| 亚洲午夜精品在线| 欧美电影在线观看| 亚洲高清久久| 国产精品久久久久久一区二区三区| 欧美高清视频免费观看| 亚洲嫩草精品久久| 最新国产成人在线观看| 国产一区二区三区不卡在线观看| 亚洲一区二区视频在线观看| 美日韩丰满少妇在线观看| 亚洲欧美日本国产有色| 99re亚洲国产精品| 亚洲精品国精品久久99热| 久久国产福利| 久久一二三区| 亚洲自拍高清| 亚洲精品在线三区| 男同欧美伦乱| 久久国产精品亚洲77777| 久久免费高清视频| 亚洲无线视频| 一本色道久久综合精品竹菊 |