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[];
}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的更多相关文章
- Lua中的userdata
[话从这里说起] 在我发表<Lua中的类型与值>这篇文章时,就有读者给我留言了,说:你应该好好总结一下Lua中的function和userdata类型.现在是时候总结了.对于functio ...
- lua学习笔记之userdata
这一段时间看了<programming in lua>中的第28章,看一遍并不是很难,但是只是朦胧的感觉,雾里看花,水中望月.最终还是决定敲出来自己看看,练练手,结果受益不少,也遇到了一些 ...
- Lua 笔记
lua命令: #enter shell lua #excute script file lua xxx.lua lua脚本: #!/usr/local/bin/lua 核心概念: As a exten ...
- Lua的Full UserData、Light UserData和metatable
http://lua.2524044.n2.nabble.com/LightUserData-and-metatables-td3807698.html https://www.lua.org/man ...
- Lua笔记
闭包 示例一 function newCounter() return function() -- anonymous function i = i + return i end end c1 = n ...
- Lua笔记(2)
函数高级特性 像新版c++一样,lua支持lambda表达式.也就是可以在函数内部声明函数.内层的函数可以访问外一层函数的局部变量. 一个函数以及它会访问到的外层函数的变量,称为闭包.这些变量又被称为 ...
- Lua笔记(1)
今天开始学习Lua,下面把一些重点记下来: 单行注释-- ,多行注释 --[[ ....... --]] Lua中false和nil表示条件判断的假,其余的,包括空字符串,0,都表示真. Lua没 ...
- LUA笔记之表
表据说是LUA的核, 呵呵, 看例子吧, 看上去, 跟java的list很像, 又有点像json: a = {} -- create a table and store its reference i ...
- LUA笔记之字符串
LUA提供了自动数值转换, 基本上说是乱来也不为过, 就当做是不熟悉数据结构吧, 例子: print("10" + 1) --> 11 print("10 + 1& ...
随机推荐
- docker 从容器中拷文件到宿主机器中
sudo docker cp 1d051604e0ea:/root/data /home/developer/zhanghui/data
- 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈
[BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同 ...
- [LintCode] 带最小值操作的栈
class MinStack { public: MinStack() { // do initialization if necessary } void push(int number) { // ...
- 巨蟒python全栈开发-第11天 第一类对象 闭包 迭代器
一.今日主要内容总览(重点) 1.第一类对象->函数名=>变量名 (1)函数对象可以像变量一样进行赋值 (2)还可以作为列表的元素进行使用 (3)还可以作为返回值返回 (4)还可以作为参数 ...
- 并发编程6 锁&进程&队列
1.进程的其他方法 2.验证进程空间隔离和守护进程 3.孤儿进程和僵尸进程 4.锁 for循环加join数据共享 5.进程队列的简单应用 6.通过队列实现进程间的通信 7.生产者消费者模型及Queue ...
- 巨蟒python全栈开发数据库前端5:JavaScript1
1.js介绍&变量&基础数据类型 2.类型查询&运算符&if判断&for循环 3.while循环&三元运算符 4.函数 5.今日总结 1.js介绍&am ...
- Django Signal 代码布局
需要确保信号注册函数在使用前就被引入,所以理论上你可以将其置于满足上述条件的任意位置. 官方推荐 将信号处理器定义在关联 app 目录下的 signals.py 中,在关联 app 的 apps.Ap ...
- 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 ...
- JS eval()函数
js eval()函数 这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它. 举个小例子: //执行表达式 var the_unevaled_answer = & ...
- 面向对象 - 1.软件开发/2.异常处理/3.try...except的详细用法
1.软件开发 软件的开发其实一整套规范,我们所学的只是其中的一小部分,一个完整的开发过程,需要明确每个阶段的任务,在保证一个阶段正确的前提下再进行下一个阶段的工作,称之为软件工程 面向对象的软件工程包 ...