#include <limits.h> #define BITS_PER_WORD (CHAR_BIT*sizeof(unsigned int)) #define I_WORD(i) ((unsigned int)(i) / BIT_PER_WORD) #define I_BIT(i) (1 << ((unsigned int)(i) % BIT_PER_WORD))
e.g.
typedef struct NumArray
{
int size;
unsigned int values[1];
} NumArray;e.g.
sizeof(NumArray) + I_WORD( n -1 ) * sizeof(unsigned int)void* lua_newuserdata(lua_State *L,size_t size);
e.g.
static int newarray(lua_State *L)
{
int i;
size_t nbytes;
NumArray *a;
int n = luaL_checkint(L,1);
luaL_argcheck(L,n >= 1,1,"invalid siez");
nbytes = sizeof(NumArray) + I_WORD(n -1)*sizeof(unsigned int);
a = (NumArray*)lua_newuserdata(L,nbytes);
a->size = n;
for(i = 0;i <= I_WORD(n -1); i++)
a->values[i] = 0;
return 1;
}static int setarray(lua_State *L)
{
NumArray *a = (NumArray*)lua_touserdata(L,1);
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");
luaL_checkany(L,3);
if(lua_toboolean(L,3))
a->values[I_WORD(index)] != I_BIT(index);
else
a->values[I_WORD(index)] &= ~I_BIT(index);
return 0;
}e.g.
array.set(0,11,0)
--stdin:1: bad argument #1 to 'set' ('array' expected) 这里的意思是第一个参数必须是数组'array'类型的
array.set(a,1)
--stdin:1: bad argument #3 to 'set' (value expected) 这里函数只传递两个参数,因此报错的是少了第三个参数,第三个参数必须有值。static int getarray(lua_State *L)
{
NumArray *a = (NumArray*)lua_touserdata(L,1);
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 range");
lua_pushboolean(L,a->value[I_WORD(index)] & I_BIT(index));
return 1;
}static int getsize (lua_State *L)
{
NumArray *a = (NumArray*)lua_touserdata(L,1);
luaL_argcheck(L, a != NULL,1"'array' expected");
lua_pushinteger(L,a->size);
return 1;
}static const struct luaL_Reg arraylib [] =
{
{"new",newarray},
{"set",setarray},
{"get",getarray},
{"size",getsize},
{NULL,NULL}
};
int luaopen_array(lua_State *L)
{
luaL_newlib(L,arraylib);
return 1;
}a = array.new(1000)
print(a) --> user data
print(array.size(a)) --> 1000
for i = 1,1000 do
array.set(a,i,i % 5 == 0) --设定
end
print(array.get(a,10)) --true --得到int luaL_newtatable(lua_State *L,const char *tname); void luaL_getmetatable(lua_State *L,const char *tname); void *luaL_checkudata(lua_State *L,int index,const char *tname);
int luaopen_array(lua_State *L)
{
luaL_newmetatable(L,"LuaBook.array"); /* 这里加入了创建metatable 的功能 */
luaL_newlib(L,arraylib);
return 1;
}static int newarray(lua_State *L)
{
//new
luaL_getmetatable(L,"LuaBook.array");
lua_setmetatable(L,-2);
return 1;
}a = array.new(1000) print(a:size()) --使用了冒号操作符 a:set(10,true) …
local metaarray = getmetatable(array.new(1)) metaarray.__index = metarray metaarray.set = array.set metaarray.get = array.get metaarray.size = array.size
static const struct luaL_Reg arraylib_f [] =
{
{"new",newarray},
{NULL,NULL}
};
static const struct luaL_Reg arraylib_m [] =
{
{"set",setarray},
{"get",getarray},
{"size",getsize},
{NULL,NULL}
};int luaopen_array(lua_State *L)
{
luaL_newmetatable(L,"LuaBook.array");
lua_pushvalue(L,-1);
lua_setfield(L,-2,"__index");
luaL_setfuncs(L,arraylib_m,0);
luaL_newlib(L,arraylib_f);
return 1;
}e.g. local metaarray = getmetatable(array.new(1)) metaarray.__index = array.get metaarray.__newindex = array.set metaarray.__len = array.size
a = array.new(1000) a[10] = true -- 'setarray' print(a[10]) -- 'getarray' print(#a) -- 'getsize'
《Programming in Lua 3》读书笔记(二十五)
原文地址:http://blog.csdn.net/zh379835552/article/details/38986259