lua userdata 就是用户自定义类型的数据

直接上例子

wss@localhost:~/lua/userdata/userdata2$ ls

array.so  arr_test.lua  lib.c  log.lua


wss@localhost:~/lua/userdata/userdata2$ vim lib.c

#include <stdio.h>

#include <string.h>

#include <lua.h>

#include <lauxlib.h>

#include <lualib.h>


typedef struct NumArray

{

        int size;

        double values[1];  /* variable part */

}NumArray;


static int newarray (lua_State *L)

{

        int n = luaL_checkint(L, 1);  //检查所给参数是否是一个数字,如果是返回该数字,否则报错

        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 */

}


static int setarray (lua_State *L)

{

        NumArray *a = (NumArray *)lua_touserdata(L, 1);  //返回userdata的地址

        int index = luaL_checkint(L, 2);

        double value = luaL_checknumber(L, 3);


        luaL_argcheck(L, a != NULL, 1, "'array' expected");

        //检查a != NULL 是否等于true,如果不是,抛出错误,并给出指定的错误信息


        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 luaL_Reg arraylib [] =

{


        {"new", newarray},

        {"set", setarray},

        {"get", getarray},

        {"size", getsize},

        {NULL, NULL}


};


int luaopen_array (lua_State *L)

{

        const char* libName = "array";

        luaL_register(L,libName,arraylib);

        return 1;


}



wss@localhost:~/lua/userdata/userdata2$ vim arr_test.lua

require "array"

local log = require "log"

a = array.new(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

log.print_r(array.get(a, 10))



wss@localhost:~/lua/userdata/userdata2$ gcc -fpic -shared -o array.so lib.c

wss@localhost:~/lua/userdata/userdata2$ ls

array.so  arr_test.lua  lib.c  log.lua

wss@localhost:~/lua/userdata/userdata2$ lua arr_test.lua

userdata: 0x8aeb784

1000

0.1


log.lua是用来调试,打印信息的,在每个.lua文件开始添加一行local log = require "luci.log",在需要打印的函数中调用log.print()或者log.print_r(), 最后在/tmp/luci.output文件中查看添加的打印内容。

如:

wss@localhost:~/lua/userdata/userdata2$ echo "" > /tmp/luci.output

wss@localhost:~/lua/userdata/userdata2$ cat /tmp/luci.output       


wss@localhost:~/lua/userdata/userdata2$ lua arr_test.lua           

userdata: 0x82256ac

1000

0.1

wss@localhost:~/lua/userdata/userdata2$ cat /tmp/luci.output


[11:20:43]: 0.1 

log.print打印一个普通变量

log.print_r打印table