使用C的数组来扩充lua

1.lua代码

ss = require "LUA2C1"

a= ss.new(1000)   --数组大小为1000
print(a) 

print(ss.size(a))  --获取数组的大小
for i=1,1000 do
	ss.set(a, i, 1/i)  --设置数组的值
end 
print(ss.get(a, 10))   --获取数组的值


2.C代码(省略了头文件)

typedef struct NumArray {
	int size;
	double values[1]; /* variable part */
} NumArray; 

static int newarray (lua_State *L) {
	int n = luaL_checkint(L, 1);    //查看参数是否为int类型
	size_t nbytes = sizeof(NumArray) + (n - 1)*sizeof(double);  //计算大小
	NumArray *a = (NumArray *)lua_newuserdata(L, nbytes);  //分配内存空间
	a->size = n;   //赋值
	return 1; /* new userdatum is already on the stack *///传递给lua
} 

static int setarray (lua_State *L) {
	NumArray *a = (NumArray *)lua_touserdata(L, 1);  //返回1中内存块的地址
	int index = luaL_checkint(L, 2);    //检查第二个参数是否为int
	double value = luaL_checknumber(L, 3);  //同上
	luaL_argcheck(L, a != NULL, 1, "`array' expected");  //给第1个参数设置防错信息
	luaL_argcheck(L, 1 <= index && index <= a->size, 2,  //第二个参数的防错
		"index out of range");
	a->values[index-1] = value;    //设置数组中的数值
	return 0;
}

static int getarray (lua_State *L) {   //获取数组中的值
	NumArray *a = (NumArray *)lua_touserdata(L, 1);  //从栈中获取内存块
	int index = luaL_checkint(L, 2);   //检查第二个参数的值
	luaL_argcheck(L, a != NULL, 1, "'array' expected");
	luaL_argcheck(L, 1 <= index && index <= a->size, 2,
		"index out of range");
	lua_pushnumber(L, a->values[index-1]);   //获取第二个参数的值
	return 1;
} 

static int getsize (lua_State *L) {    //获取数组的大小
	NumArray *a = (NumArray *)lua_touserdata(L, 1);
	luaL_argcheck(L, a != NULL, 1, "`array' expected");
	lua_pushnumber(L, a->size);   //获取这个值
	return 1;
} 



static struct luaL_Reg func[] =
{
	{"sum", sum},
	{"l_map", l_map},
	{"add", Add},
	{"l_split", l_split},
	{"showstr", showstr},
	{"str_upper", str_upper},
	{"new", newarray},
	{"set", setarray},
	{"get", getarray},
	{"size", getsize}, 
	{NULL, NULL}
};

int luaopen_LUA2C1(lua_State *L)
{
	luaL_register(L, "ss", func);
	return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值