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
lua userdata 使用
最新推荐文章于 2024-02-08 11:37:04 发布