lua userdata 使用

extern "C"
{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
#include <iostream>
using namespace std;

#pragma comment(lib,"E:\\luaSRC\\lua5.1\\lib\\static\\lua5.1.lib")

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


static int setarray (lua_State *L)
{
	NumArray *a = (NumArray *)lua_touserdata(L, 1);
	int index = luaL_checkint(L, 2);
	double value = luaL_checknumber(L, 3);

	luaL_argcheck(L, a != NULL, 1, "`array' expected");
	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 newarray (lua_State *L) 
{
	int n = luaL_checkint(L, 1);

	//由于原始的结构中已经包含了一个元素的空间,所以我们从n 中减去 1

	size_t nbytes = sizeof(NumArray) + (n - 1)*sizeof(double);	//这里后面为什么要sizeof(double)? 而不是sizeof(NumArray) 是因为这始终只是一个结构体 前缀int不变 扩充结构体后面的数组大小

	//调用lua_newuserdata分配指定的大小空间,并压入栈中作为返回值
	NumArray *a = (NumArray *)lua_newuserdata(L, nbytes);

	a->size = n;

	//分配的内存已经在栈中
	return 1;  /* new userdatum is already on the stack */
}

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 const struct luaL_reg arraylib [] = 
{
	{"new", newarray},
	{"set", setarray},
	{"get", getarray},
	{"size", getsize},
	{NULL, NULL}
};

int luaopen_array (lua_State *L) 
{
	luaL_openlib(L, "array", arraylib, 0);

	return 1;
}

void main()
{
	lua_State* L = luaL_newstate();
	luaL_openlibs(L);

	luaopen_array(L);

	int r = luaL_dofile(L,"1.lua");
	
	lua_close(L);

}

1.lua
func =  package.loadlib("lua_newuserdata.dll","luaopen_mylib");
func();		--导出函数
a = array.new(1000);	--分配1000个空间大小
print(a);	--> userdata: 0x8064d48 
print(array.size(a));	--> 1000
for i=1,1000 do
	array.set(a,i,1/i);
end
print(array.get(a,10));	--> 0.1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值