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;
}