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

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

  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>
            欧美成人一区二区| 国产精品一区久久久久| 1204国产成人精品视频| 久久久久久日产精品| 亚洲欧美日韩精品久久久| 国产女主播一区二区| 欧美一区二区三区四区视频| 午夜欧美大片免费观看| 极品少妇一区二区三区| 免费亚洲视频| 欧美日韩国产123| 午夜天堂精品久久久久| 欧美一区二区观看视频| 在线视频观看日韩| 亚洲日本va在线观看| 国产精品久久久久久一区二区三区 | 亚洲嫩草精品久久| 国产自产在线视频一区| 欧美激情影音先锋| 欧美网站在线观看| 久久综合久久综合久久综合| 欧美福利视频在线| 欧美一区二区精美| 久久中文字幕导航| 亚洲欧美日韩国产一区| 久久嫩草精品久久久久| 一区二区三区毛片| 久久精品国产99| 一区二区三区视频在线观看| 久久精品国产999大香线蕉| 一区二区三区国产精华| 欧美在线亚洲在线| 一道本一区二区| 欧美在线影院| 亚洲一区bb| 蜜臀av在线播放一区二区三区| 午夜精品久久久久影视| 欧美成人综合在线| 久久人人爽人人爽| 国产精品日韩精品欧美在线| 欧美成熟视频| 国产一区二区三区四区hd| 夜夜嗨av一区二区三区中文字幕| 黑人一区二区| 亚洲欧洲av一区二区| 99国产精品久久| 久久亚洲精品一区| 久久久久久久波多野高潮日日| 欧美日韩中文字幕日韩欧美| 欧美xart系列高清| 激情亚洲成人| 久久精品国产亚洲aⅴ| 午夜亚洲激情| 国产精品久久福利| 99re6热在线精品视频播放速度| 在线欧美电影| 久久一日本道色综合久久| 久久国产福利| 国产日韩欧美二区| 午夜在线电影亚洲一区| 午夜精品成人在线视频| 国产精品福利在线观看| 一二美女精品欧洲| 亚洲一区制服诱惑| 欧美性猛交xxxx免费看久久久| 99在线热播精品免费| 在线中文字幕不卡| 欧美日韩国产首页| 日韩视频免费观看| 亚洲欧美日韩系列| 国产麻豆日韩欧美久久| 亚洲女人小视频在线观看| 欧美亚洲视频在线观看| 国产乱码精品一区二区三区av| 午夜久久美女| 久热精品在线视频| 在线观看日韩一区| 欧美激情性爽国产精品17p| 91久久精品国产91久久| 99视频精品在线| 国产精品久久久久影院色老大 | 在线视频欧美一区| 欧美另类人妖| 亚洲深爱激情| 久久精品国产77777蜜臀| 狠狠色2019综合网| 免费观看亚洲视频大全| 日韩图片一区| 小黄鸭视频精品导航| 激情久久中文字幕| 欧美jizzhd精品欧美喷水| 亚洲最新在线视频| 久久久www| 亚洲免费观看在线观看| 国产精品久久久久久久电影| 欧美专区在线播放| 亚洲国产色一区| 午夜久久久久| 亚洲成色777777在线观看影院| 欧美理论电影网| 亚洲女同同性videoxma| 你懂的亚洲视频| 亚洲欧美日韩在线不卡| 亚洲福利在线观看| 国产精品毛片| 亚洲精品在线电影| 国产色产综合产在线视频| 欧美成年视频| 性色av香蕉一区二区| 亚洲激情一区| 久久精品亚洲| 亚洲一区二区少妇| 亚洲电影免费观看高清完整版| 国产精品久久久一本精品| 久久亚裔精品欧美| 午夜精品久久久久久久男人的天堂 | 亚洲人www| 很黄很黄激情成人| 国产精品女人久久久久久| 欧美成人dvd在线视频| 欧美亚洲在线视频| 在线综合亚洲欧美在线视频| 欧美激情四色| 欧美成人一区二区三区| 久久久另类综合| 午夜精品福利一区二区蜜股av| 亚洲精品一品区二品区三品区| 国产一区视频在线观看免费| 欧美亚洲不卡| 欧美三级网址| 欧美精品xxxxbbbb| 老司机午夜免费精品视频 | 99精品免费| 亚洲人成人一区二区在线观看| 欧美/亚洲一区| 久久先锋影音| 欧美在线一二三区| 欧美一级片在线播放| 亚洲午夜在线视频| 亚洲午夜激情| 亚洲视频1区| 亚洲午夜精品久久| 亚洲影院一区| 亚洲欧美一级二级三级| 亚洲主播在线| 亚洲欧美日韩在线| 欧美一区二区三区四区在线观看地址| 亚洲一区区二区| 亚洲综合色丁香婷婷六月图片| 亚洲午夜精品17c| 亚洲宅男天堂在线观看无病毒| 亚洲午夜精品国产| 香蕉视频成人在线观看 | 亚洲天天影视| 亚洲欧美日韩一区二区三区在线观看 | 亚洲大片av| 日韩视频在线观看免费| 一区电影在线观看| 亚洲欧美成aⅴ人在线观看| 久久爱91午夜羞羞| 久久在线播放| 亚洲黄色大片| 亚洲手机视频| 久久精品人人爽| 免费试看一区| 国产精品另类一区| 红桃视频一区| 一区二区三区国产精品| 欧美一级理论性理论a| 男女激情久久| 一区二区三区高清不卡| 亚洲欧美制服另类日韩| 久久综合久久88| 欧美日韩视频免费播放| 国产日韩av一区二区| 亚洲国产成人porn| 亚洲欧美大片| 美日韩精品视频| 亚洲精品久久久久中文字幕欢迎你| 一本色道久久综合一区| 久久久夜夜夜| 欧美午夜精品电影| 樱桃成人精品视频在线播放| 在线亚洲自拍| 美脚丝袜一区二区三区在线观看| 日韩视频在线一区| 久久综合五月天婷婷伊人| 国产精品福利在线观看网址| 一区在线免费观看| 午夜精品理论片| 亚洲国产日日夜夜| 久久精品国产99国产精品澳门 | 女人香蕉久久**毛片精品| 国产精品免费福利| 亚洲片在线观看| 久久久久九九九九| 亚洲一区观看| 欧美日韩国产首页| 91久久精品视频| 久久在线视频在线|