亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > 綜合 > 正文

Lua教程(二十二):userdata

2024-07-21 23:04:46
字體:
供稿:網(wǎng)友

在Lua中可以通過自定義類型的方式與C語言代碼更高效、更靈活的交互。這里我們通過一個簡單完整的示例來學(xué)習(xí)一下Lua中userdata的使用方式。需要說明的是,該示例完全來自于Programming in Lua。其功能是用C程序?qū)崿F(xiàn)一個Lua的布爾數(shù)組,以提供程序的執(zhí)行效率。見下面的代碼和關(guān)鍵性注釋。  

 

復(fù)制代碼 代碼如下:

#include <lua.hpp>
#include <lauxlib.h>
#include <lualib.h>
#include <limits.h>

 

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

typedef struct NumArray {
    int size;
    unsigned int values[1];
} NumArray;

extern "C" int newArray(lua_State* L)
{
    //1. 檢查第一個參數(shù)是否為整型。以及該參數(shù)的值是否大于等于1.
    int n = luaL_checkint(L,1);
    luaL_argcheck(L, n >= 1, 1, "invalid size.");
    size_t nbytes = sizeof(NumArray) + I_WORD(n - 1) * sizeof(int);
    //2. 參數(shù)表示Lua為userdata分配的字節(jié)數(shù)。同時將分配后的userdata對象壓入棧中。
    NumArray* a = (NumArray*)lua_newuserdata(L,nbytes);
    a->size = n;
    for (int i = 0; i < I_WORD(n - 1); ++i)
        a->values[i] = 0;
    //獲取注冊表變量myarray,該key的值為metatable。
    luaL_getmetatable(L,"myarray");
    //將userdata的元表設(shè)置為和myarray關(guān)聯(lián)的table。同時將棧頂元素彈出。
    lua_setmetatable(L,-2);
    return 1;
}

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

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

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

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

static luaL_Reg arraylib_f [] = {
    {"new", newArray},
    {NULL, NULL}
};

static luaL_Reg arraylib_m [] = {
    {"set", setArray},
    {"get", getArray},
    {"size", getSize},
    {"__tostring", array2string}, //print(a)時Lua會調(diào)用該元方法。
    {NULL, NULL}
};

extern "C" __declspec(dllexport)
int luaopen_testuserdata(lua_State* L)
{
    //1. 創(chuàng)建元表,并將該元表指定給newArray函數(shù)新創(chuàng)建的userdata。在Lua中userdata也是以table的身份表現(xiàn)的。
    //這樣在調(diào)用對象函數(shù)時,可以通過驗證其metatable的名稱來確定參數(shù)userdata是否合法。
    luaL_newmetatable(L,"myarray");
    lua_pushvalue(L,-1);
    //2. 為了實現(xiàn)面對對象的調(diào)用方式,需要將元表的__index字段指向自身,同時再將arraylib_m數(shù)組中的函數(shù)注冊到
    //元表中,之后基于這些注冊函數(shù)的調(diào)用就可以以面向?qū)ο蟮男问秸{(diào)用了。
    //lua_setfield在執(zhí)行后會將棧頂?shù)膖able彈出。
    lua_setfield(L,-2,"__index");
    //將這些成員函數(shù)注冊給元表,以保證Lua在尋找方法時可以定位。NULL參數(shù)表示將用棧頂?shù)膖able代替第二個參數(shù)。
    luaL_register(L,NULL,arraylib_m);
    //這里只注冊的工廠方法。
    luaL_register(L,"testuserdata",arraylib_f);
    return 1;
}


 
輕量級userdata:

 

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

 
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
一区二区三区观看| 亚洲精品第1页| 无码播放一区二区三区| 国产精品亚洲人在线观看| 中国女人精69xxxxxx视频| 激情六月婷婷久久| 日韩在线精品| 成人a区在线观看| 色欧美日韩亚洲| 国产精品美女网站| 美女福利网站视频在线观看| 99国产欧美久久久精品| 中文天堂最新版本在线观看| 亚洲 欧美 变态 另类 综合| 国产精品嫩草影院在线看| 亚洲影院污污.| www.午夜激情| 暖暖成人免费视频| www激情久久| 最猛黑人系列在线播放| 在线激情影院一区| 小明精品国产一区二区三区| 成人在线短视频| 亚洲色图 校园春色| 日韩最新在线视频| 精品视频在线一区二区在线| 国产精品激情电影| 91大片在线观看| 黄色在线小视频| 丝瓜av网站精品一区二区| 国产精品怡红院| 7777奇米亚洲综合久久| 日韩精品乱码免费| www.色小姐com| 日本一区午夜艳熟免费| 日韩三级久久| 午夜剧场成人观在线视频免费观看| 精品国产乱码久久久久久免费| 国内外成人在线视频| 国产**成人网毛片九色| 日批视频免费观看| 欧美一区在线看| 日韩美女啊v在线免费观看| 69堂免费精品视频在线播放| 欧美性一区二区| 国产粉嫩在线观看| 九色精品美女在线| 国产丝袜一区二区三区| 日韩精品一区二区在线播放| 欧美黄色大片网站| 欧美高清性xxxxhdvideosex| 免费h精品视频在线播放| 色视频成人在线观看免| 中文字幕丰满孑伦无码专区| 欧美乱妇高清无乱码免费| 亚洲一区av| 久久婷婷久久一区二区三区| 91精品入口蜜桃| 二区三区在线观看| 鲁鲁在线中文| 久久久av水蜜桃| 波多野结衣片子| 成人91在线| 看全色黄大色大片| 精品乱码一区二区三区| 91午夜视频在线观看| 我要看一级黄色录像| 欧美6699| 成人小视频免费观看| 91精品啪在线观看国产18| 欧美美女网站色| www.欧美精品一二区| 黄色在线资源| 99视频在线观看地址| 国产黄色免费看| 在线播放av更多| 在线播放亚洲激情| 欧美成人精品激情在线观看| 国产毛片毛片| 黄色美女网站在线观看| 国模一区二区三区| 2018国产在线| 欧美日韩一级二级| 好吊妞www.84com只有这里才有精品| 一卡二卡欧美日韩| av片在线免费| 在线观看一区不卡| 国产精品毛片视频| 黄色网址在线免费看| 欧美性猛交xxxx免费看| 亚洲国产精品成人综合久久久| 中文在线最新版天堂| 精品久久久久久乱码天堂| 五月天婷婷社区| 校花撩起jk露出白色内裤国产精品| 尤物视频免费观看| 色综合久久88色综合天天看泰| chinese偷拍一区二区三区| 国产免费播放一区二区| 欧洲在线免费视频| 精品欧美一区二区三区精品久久| 久久无码专区国产精品s| 成年人观看网站| 在线视频综合导航| 亚洲国产精品成人综合| 国产精品久久久久久久泡妞| 亚洲线精品一区二区三区八戒| 日韩欧国产精品一区综合无码| 久久伊人精品视频| 22288色视频在线观看| 国产成人av电影在线| 国产一级在线观看www色| 色先锋av影音| 亚洲欧美卡通另类91av| 欧美日韩国产精品一区二区亚洲| 国产精品一级黄片| 亚洲桃色在线一区| 成人在线免费播放视频| 国产福利视频导航| 国产精品久久激情| 成人妇女免费播放久久久| 3d动漫精品啪啪一区二区三区免费| 国产黄色片在线| 国产激情在线播放| 激情小说一区| 久久天堂av综合合色蜜桃网| 久色视频网站| 欧美亚洲综合一区| 天天草天天操| 91传媒久久久| 欧美日韩国产页| 色婷婷av一区二区三区软件| 在线宅男视频| 国产精品小仙女| 五月婷婷激情五月| 水蜜桃久久夜色精品一区的特点| 日韩免费在线观看视频| 国产不卡视频一区二区三区| 日韩伦理在线免费观看| 无码人妻精品一区二区三区9厂| 日韩精品免费一区二区夜夜嗨| 2014国产精品| 亚洲av综合色区无码一区爱av| 欧美日韩加勒比精品一区| 日韩亚洲欧美一区二区三区| 99精品久久免费看蜜臀剧情介绍| caoporn97在线视频| 免费黄色网址在线| 国产精品二区二区三区| 91网上在线视频| 成人欧美一区二区三区黑人免费| 9l视频自拍蝌蚪9l视频成人| 夜夜嗨aⅴ一区二区三区| 91女人18毛片水多国产| 天天爽夜夜爽人人爽| 999精品在线观看| 日韩精品一区二区三区中文不卡| 亚洲精品在线一区二区| 日韩av一卡二卡| 羞羞色午夜精品一区二区三区| 国产香蕉尹人视频在线| 亚洲精品国偷拍自产在线观看蜜桃| 99久久99九九99九九九| 91一区二区视频| 中国女人特级毛片| 精品久久国产精品| 日本视频在线播放| 日本不卡视频一二三区| 精选一区二区三区四区五区| www.久久ai| 精品视频高清无人区区二区三区| 国产99视频在线| 亚洲色图丝袜美腿| 国产视频久久| 中文在线观看视频| 美国av一区二区| 人妖粗暴刺激videos呻吟| 视频一区视频二区中文字幕| 在线看视频不卡| 精品久久久久久久一区二区蜜臀| 国产+成+人+亚洲欧洲自线| 欧美激情图片小说| 精品国产高清自在线一区二区三区| 在线亚洲人成电影网站色www| 亚洲色图25p| 免费白浆视频| 麻豆成人在线视频| 不卡av在线免费观看| 国产精品一级在线| 九9re精品视频在线观看re6| 欧美孕妇与黑人巨交| jizz在线观看| 亚洲欧美一区二区三区久本道91| 91在线看国产| 亚洲高清视频一区| 一级在线观看| 亚洲精品一区二三区| www.欧美日韩国产在线| aaaaaav| 国产91亚洲精品| 三级视频在线观看| 中文字幕日韩一区二区不卡| 中文字幕在线观看91| 视频一区二区三| 精品在线不卡| 欧美一区二区视频免费观看| 性高潮久久久久久久久| 国产精品国产三级国产a| 中日精品一色哟哟| 无国产精品白浆免费视| 亚洲欧美视频一区二区| 一本大道香蕉久在线播放29| 久久66热这里只有精品| 国产高清在线一区二区| 精品国产一区二区三区性色av| 国产在线视频第一页| 天天在线免费视频| 色婷婷久久av| 草久久免费视频| 欧美精品一二三四| 日韩av黄色| 99久久免费观看| 东方欧美亚洲色图在线| 国产手机在线视频| 一区二区三区日本| 欧美性猛交7777777| 日本三级黄色大片| 91精品国产91久久久久青草| 大胆av不用播放器在线播放| 国产三级视频网站| 嘿嘿视频在线观看| 日韩精品免费一区二区三区竹菊| 精品少妇久久久久久888优播| 亚洲大片免费观看| 欧美日韩黄色一区二区| 欧美中在线观看| 免费黄色大片| 国产精品十八以下禁看| 91麻豆成人久久精品二区三区| 国产无遮挡aaa片爽爽| 国产精品福利电影一区二区三区四区| 日韩av不卡播放| av影音资源网| 欧美日韩一区二区综合| 播金莲一级淫片aaaaaaa| 国产又粗又长又爽又黄的视频| 国产在线观看99| www激情久久| 国产成人亚洲欧美电影| 亚洲国产精品99久久久久久久久| 在线看国产日韩| 亚洲一区二区色| 精品国偷自产一区二区三区| 嫩草影院发布页| 国产乱码77777777| 大地资源网在线观看免费官网| www.欧美激情.com| 亚州一区二区| 给我免费观看片在线电影的| 91激情五月电影| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美天天在线| 国产在线观看中文字幕| 日韩欧美中文| 污视频在线观看免费| 中文字幕av免费在线观看| 亚洲国产精品推荐| 日韩不卡一区二区三区| 鲁丝一区鲁丝二区鲁丝三区| 国产欧美一区二区三区精品观看| 国产精品资源| 亚洲人成绝费网站色ww| 波多野结衣在线aⅴ中文字幕不卡| 9国产精品视频| freexxxx性特大另类| 国产男女无遮挡猛进猛出| 97在线电影| 嫩草影院2018| 欧美激情综合色| 性一交一乱一区二区洋洋av| 国产成人精品男人的天堂538| 成人免费视频网址| 欧美专区18| 一色桃子av在线| www.色五月.com| 国内自拍视频在线播放| 在线观看入口黄最新永久免费国产| 亚洲精品乱码久久久久久蜜桃91| 欧美日韩成人在线| 欧美日韩综合精品| 天堂网av成人| 国产尤物精品| 97超视频免费观看| 国产精品电影一区二区| 久久久久久久久久久9不雅视频| 亚洲影院免费观看| 欧美a极品极品欧美| 免费av在线网站| 中文字字幕在线观看| 亚洲视频一区二区三区四区| 日韩一区精品| 91亚洲国产成人久久精品| 国产一区二区日韩精品欧美精品| 日本精品中文字幕| 欧美久久一区二区三区| c++连点器| 国产亚洲精品久久久网站好莱| 色哟哟一区二区在线观看| 手机看片一区二区三区| 亚洲第一区视频| 久久精品九色| 中文字幕999| 欧美日韩精品一区二区在线播放| 波多结衣在线观看| 欧美洲成人男女午夜视频| 免费成人黄色网址| 国产精品免费一区二区| 青青草国产免费| 国产精品三级在线观看无码| 精品国产电影一区| 久久久久亚洲精品成人网小说| 欧美日韩一区二区三区免费| 夜夜揉揉日日人人青青一国产精品| 国产xxxx振车| 欧美黑人xxxx| 国内精品伊人久久久| 国产在线观看a| 国产一线二线三线在线观看|