lua_newuserdata简单使用
来源:互联网 发布:信贷规模数据 编辑:程序博客网 时间:2024/06/05 00:25
void *lua_newuserdata (lua_State *L, size_t size);
lua_newuserdata 函数按照指定的大小分配一块内存,将对应的 userdatum放到栈内,
并返回内存块的地址。
一个简单的调用lua_newuserdata 分配空间的例子:
LuaTestDll.h
extern "C"{#include "lua/lua.h"#include "lua/lualib.h"#include "lua/lauxlib.h"#include "lua/luaconf.h"LUATESTDLL_API int luaopen_mylib(lua_State *L);};
LuaTestDll.cpp
#include "LuaTestDll.h"typedef struct NumArray{int size;double values[1];}NumArray;static int newarray(lua_State *L){int n = luaL_checkint(L,1);//由于原始的结构中已经包含了一个元素的空间,所以我们从n 中减去 1size_t nbytes = sizeof(NumArray) + (n-1)*sizeof(double);//调用lua_newuserdata分配指定的大小空间,并压入栈中作为返回值NumArray *a = (NumArray*)lua_newuserdata(L,nbytes);a->size = n;//分配的内存已经在栈中return 1;}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 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_mylib(lua_State *L){luaL_openlib(L,"array",arraylib,0);return 1;}
Test.lua
func = package.loadlib("LuaTestDll.dll","luaopen_mylib");func();--导出函数a = array.new(1000);--分配1000个空间大小print(a);--> userdata: 0x8064d48 print(array.size(a));--> 1000for i=1,1000 doarray.set(a,i,1/i);endprint(array.get(a,10));--> 0.1
0 0
- lua_newuserdata简单使用
- 简单使用
- 简单使用
- 简单使用
- springBoot简单学习使用;curl简单使用
- java使用redis简单使用
- spring 简单使用AOC使用
- logstash使用之简单使用
- 简单易懂的使用
- ant的简单使用
- jUDDI 简单安装使用
- 简单使用有限自动机
- 简单使用_dopostback函数
- Log4j的简单使用
- msconfig简单使用
- DOM对象简单使用
- TCPDUMP的简单使用
- 使用easymock简单举例
- ios navigationbar 主界面隐藏,下一页面显示
- 数据库连接串
- iptable_nat_ssh_note
- #include<file.h>与#include "file.h"区别
- 浏览器开启打印当前网页
- lua_newuserdata简单使用
- Oracle IO问题解析
- 大摩电话面试经历
- C#日期函数使用大全
- Apache2.2 +tomcat httpd.conf文件配置
- iOS开发之Objective-C与JavaScript的交互
- c++ 指针大小
- 虚拟IP原理
- x86和x64