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[];
}NumArray; static int
lnew(lua_State *L)
{
int arr_size = luaL_checkint(L, );
if (arr_size <= )
{
assert(NULL);
} size_t nbytes = sizeof(NumArray) + (arr_size - ) * sizeof(double);
NumArray *na = (NumArray *)lua_newuserdata(L, nbytes);
na->size = arr_size; return ;
} static int
lset(lua_State *L)
{
NumArray *na = (NumArray *)lua_touserdata(L, );
int idx = luaL_checkint(L, );
double value = luaL_checknumber(L, );
printf("idx %d, value %f\n", idx, value);
luaL_argcheck(L, na != NULL, , "array expected");
luaL_argcheck(L, <= idx && idx <= na->size , , "index out of range"); na->values[idx - ] = value; return ;
} static int
lget(lua_State *L)
{
NumArray *na = (NumArray *)lua_touserdata(L, );
int idx = luaL_checkinteger(L, ); luaL_argcheck(L, na != NULL, , "array expected");
luaL_argcheck(L, <= idx && idx <= na->size, , "index out of range"); lua_pushnumber(L, na->values[idx - ]); return ;
} static int
lfind(lua_State *L)
{
NumArray *na = (NumArray *)lua_touserdata(L, );
assert(na != NULL);
double elem = luaL_checknumber(L, ); int idx;
for (idx = ; idx < na->size; idx++)
{
if (na->values[idx] == elem)
{
lua_pushnumber(L, idx + );
return ;
}
} lua_pushnumber(L, -);
return ;
} 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 ;
}

编译这个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() newarray.set(na, , ) local value = newarray.find(na, ) if value ~= - then
print("value is ", value)
else
print("not exists")
end

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

结果如下:

先让程序跑起来,理解。

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

lua笔记之userdata的更多相关文章

  1. Lua中的userdata

    [话从这里说起] 在我发表<Lua中的类型与值>这篇文章时,就有读者给我留言了,说:你应该好好总结一下Lua中的function和userdata类型.现在是时候总结了.对于functio ...

  2. lua学习笔记之userdata

    这一段时间看了<programming in lua>中的第28章,看一遍并不是很难,但是只是朦胧的感觉,雾里看花,水中望月.最终还是决定敲出来自己看看,练练手,结果受益不少,也遇到了一些 ...

  3. Lua 笔记

    lua命令: #enter shell lua #excute script file lua xxx.lua lua脚本: #!/usr/local/bin/lua 核心概念: As a exten ...

  4. Lua的Full UserData、Light UserData和metatable

    http://lua.2524044.n2.nabble.com/LightUserData-and-metatables-td3807698.html https://www.lua.org/man ...

  5. Lua笔记

    闭包 示例一 function newCounter() return function() -- anonymous function i = i + return i end end c1 = n ...

  6. Lua笔记(2)

    函数高级特性 像新版c++一样,lua支持lambda表达式.也就是可以在函数内部声明函数.内层的函数可以访问外一层函数的局部变量. 一个函数以及它会访问到的外层函数的变量,称为闭包.这些变量又被称为 ...

  7. Lua笔记(1)

    今天开始学习Lua,下面把一些重点记下来: 单行注释-- ,多行注释 --[[  .......  --]] Lua中false和nil表示条件判断的假,其余的,包括空字符串,0,都表示真. Lua没 ...

  8. LUA笔记之表

    表据说是LUA的核, 呵呵, 看例子吧, 看上去, 跟java的list很像, 又有点像json: a = {} -- create a table and store its reference i ...

  9. LUA笔记之字符串

    LUA提供了自动数值转换, 基本上说是乱来也不为过, 就当做是不熟悉数据结构吧, 例子: print("10" + 1) --> 11 print("10 + 1& ...

随机推荐

  1. docker 从容器中拷文件到宿主机器中

    sudo docker cp 1d051604e0ea:/root/data /home/developer/zhanghui/data

  2. 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈

    [BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同 ...

  3. [LintCode] 带最小值操作的栈

    class MinStack { public: MinStack() { // do initialization if necessary } void push(int number) { // ...

  4. 巨蟒python全栈开发-第11天 第一类对象 闭包 迭代器

    一.今日主要内容总览(重点) 1.第一类对象->函数名=>变量名 (1)函数对象可以像变量一样进行赋值 (2)还可以作为列表的元素进行使用 (3)还可以作为返回值返回 (4)还可以作为参数 ...

  5. 并发编程6 锁&进程&队列

    1.进程的其他方法 2.验证进程空间隔离和守护进程 3.孤儿进程和僵尸进程 4.锁 for循环加join数据共享 5.进程队列的简单应用 6.通过队列实现进程间的通信 7.生产者消费者模型及Queue ...

  6. 巨蟒python全栈开发数据库前端5:JavaScript1

    1.js介绍&变量&基础数据类型 2.类型查询&运算符&if判断&for循环 3.while循环&三元运算符 4.函数 5.今日总结 1.js介绍&am ...

  7. Django Signal 代码布局

    需要确保信号注册函数在使用前就被引入,所以理论上你可以将其置于满足上述条件的任意位置. 官方推荐 将信号处理器定义在关联 app 目录下的 signals.py 中,在关联 app 的 apps.Ap ...

  8. wire_format.cc:1091] String field 'accountid' contains invalid UTF-8 data when serializing a protocol buffer. Use the 'bytes' type if you intend to send raw bytes.

    原因: 在protobuf 的string字段中存在中文,序列化的时候会出现截断数据,string这个类型带有检查功能 解决方法: 把protobuf中存在中文的string字段类型 改为bytes ...

  9. JS eval()函数

    js  eval()函数   这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它.   举个小例子:    //执行表达式  var the_unevaled_answer = & ...

  10. 面向对象 - 1.软件开发/2.异常处理/3.try...except的详细用法

    1.软件开发 软件的开发其实一整套规范,我们所学的只是其中的一小部分,一个完整的开发过程,需要明确每个阶段的任务,在保证一个阶段正确的前提下再进行下一个阶段的工作,称之为软件工程 面向对象的软件工程包 ...