lua笔记之userdata

1.一直使用框架里封装好的c库,想着自己一点一点的写些例子,学习下,以后需要c库,可以自己写了。

下边是一个简单的userdata的例子--数组操作。

newarray.c

#include "lua.h"
#include "lauxlib.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef struct NumArray
{
    int size;
    double values[1];
}NumArray;

static int
lnew(lua_State *L)
{
    int arr_size = luaL_checkint(L, 1);
    if (arr_size <= 0)
    {
        assert(NULL);
    }

    size_t nbytes = sizeof(NumArray) + (arr_size - 1) * sizeof(double);
    NumArray *na = (NumArray *)lua_newuserdata(L, nbytes);
    na->size = arr_size;

    return 1;
}

static int
lset(lua_State *L)
{
    NumArray *na = (NumArray *)lua_touserdata(L, 1);
    int idx = luaL_checkint(L, 2);
    double value = luaL_checknumber(L, 3);
    printf("idx %d, value %f\n", idx, value);
    luaL_argcheck(L, na != NULL, 1, "array expected");
    luaL_argcheck(L, 1 <= idx && idx <= na->size , 2, "index out of range");

    na->values[idx - 1] = value;

    return 0;
}

static int
lget(lua_State *L)
{
    NumArray *na = (NumArray *)lua_touserdata(L, 1);
    int idx = luaL_checkinteger(L, 2);

    luaL_argcheck(L, na != NULL, 1, "array expected");
    luaL_argcheck(L, 1 <= idx && idx <= na->size, 2, "index out of range");

    lua_pushnumber(L, na->values[idx - 1]);

    return 1;
}    

static int
lfind(lua_State *L)
{
    NumArray *na = (NumArray *)lua_touserdata(L, 1);
    assert(na != NULL);
    double elem = luaL_checknumber(L, 2);

    int idx;
    for (idx = 0; idx < na->size; idx++)
    {
        if (na->values[idx] == elem)
        {
            lua_pushnumber(L, idx + 1);
            return 1;
        }
    }

    lua_pushnumber(L, -1);
    return 1;
}

int
luaopen_newarray(lua_State *L)
{
    luaL_checkversion(L);
    luaL_Reg l[] =
    {
        {"new", lnew},
        {"set", lset},
        {"get", lget},
        {"find", lfind},
        {NULL, NULL},
    };

    luaL_newlib(L, l);

    return 1;
}

编译这个c文件,生成动态库 , 命令: gcc -O2 -g -Wall -shared -fPIC -o newarray.so newarray.c -I/usr/include/lua5.2 -llua5.2当然我这里用的是lua5.2,用其它版本的需要更改-I,和-l的头文件和链接库的内容。

测试代码:test.lua

local newarray = require "newarray"

print(newarray)
local na = newarray.new(1000)

newarray.set(na, 1, 100)

local value = newarray.find(na, 100)

if value ~= -1 then
    print("value is ", value)
else
    print("not exists")
end

编译好newarray动态库,就可以运行测试代码了,安装lua是,编译后在src文件下有lua可执行文件,带着这个运行 ./.../lua test.lua.

结果如下:

先让程序跑起来,理解。

后续会加上详细讲解.望多多提意见,指正。。

时间: 2024-10-18 22:13:23

lua笔记之userdata的相关文章

Lua 笔记

Lua 笔记 下载 官网下载: lua官网地址 下载源码. 解压安装: tar zxvf lua-5.2.1.tar.gz 然后修改下Makefile文件, 修改其中的安装地址: # 安装的地址,以下的bin ,include lib 等都基于这个 INATALL_TOP=/usr/local/lua 然后进行 make 但是会发现有提示错误,提示没加平台的参数,这时根据提示的平台名称加在 make之后就可以了 make linux make install 执行脚本 这样就安装好了,开始第一个

快速掌握Lua 5.3 —— userdata (1)

Q:什么是"userdata"? A:"userdata"分为两类,"full userdata"和"light userdata".Lua使用他们来表示C中一些特殊的类型.前面的章节中,我们看到了如何通过C编写新的函数来扩展Lua:使用"userdata",我们将可以通过C编写新的类新来扩展Lua. Q:两种"userdata"的区别? A: \ "full userdata

Lua中的userdata

[话从这里说起] 在我发表<Lua中的类型与值>这篇文章时,就有读者给我留言了,说:你应该好好总结一下Lua中的function和userdata类型.现在是时候总结了.对于function,我在<Lua中的函数>这篇文章中进行了总结,而这篇文章将会对Lua中的userdata进行仔细的总结.对于文章,大家如果有任何疑议,都可以在文章的下方给我留言,也可以关注我的新浪微博与我互动.学习,就要分享,我期待你的加入. [userdata是啥?] userdata是啥?简单直译就是用户数

快速掌握Lua 5.3 —— userdata (2)

Q:如何使用"userdata"的"metamethods"? A:我们继续来修改上一节中的例子,这次我们的目标是使用面向对象的方式调用"userdata"的方法.这个目标既可以在Lua中实现,也可以在C库中实现,我们先来看一个比较简单的方式,在Lua中实现."mylib.c"中代码无需更改,只需要修改"a.lua"中的代码, local array = require "mylib"

Lua的Full UserData、Light UserData和metatable

http://lua.2524044.n2.nabble.com/LightUserData-and-metatables-td3807698.html "... do you realize that by setting the metatable of a light userdatayou are actually setting the metatable of all light userdata at once ?"I did not realise this. oops

设计模式实例(Lua)笔记之一(Factory Method工厂方法模式)

1.描述 女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是"造人"的工作,这个词被现代人滥用了.这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛蓝的,水是清澈的,空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的到都是静态的东西呀,怎么办?别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人,具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:第一次

学习Lua笔记_02(第二章 类型与值)

Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都“携带”了它自身的类型信息.

Lua笔记

闭包 示例一 1 function newCounter() 2 local i = 0 3 return function() -- anonymous function 4 i = i + 1 5 return i 6 end 7 end 8 9 c1 = newCounter() 10 print(c1()) --> 1 11 print(c1()) --> 2 示例二 1 function myPower(x) 2 return function(y) return y^x end 3

LUA笔记2

LUA提供了自动数值转换, 基本上说是乱来也不为过, 就当做是不熟悉数据结构吧, 例子: print("10" + 1) --> 11 print("10 + 1") --> 10 + 1 print("-5.3e-10"*"2") --> -1.06e-09 print("hello" + 1) -- ERROR (cannot convert "hello") 我个