• lua userdata


    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

  • 相关阅读:
    一个屌丝程序猿的人生(一百零二)
    一个屌丝程序猿的人生(一百零一)
    一个屌丝程序猿的人生(一百)
    一个屌丝程序猿的人生(九十九)
    JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术
    JavaEE开发之SpringMVC中的自定义拦截器及异常处理
    JavaEE开发之SpringMVC中的路由配置及参数传递详解
    JavaEE开发使用Maven管理的SpringMVC工程
    JavaEE开发之Spring中的条件注解、组合注解与元注解
    JavaEE开发之Spring中的多线程编程以及任务定时器详解
  • 原文地址:https://www.cnblogs.com/thinkinglife/p/5237891.html
Copyright © 2020-2023  润新知