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& ...
随机推荐
- 160805、oracle查询:取出每组中的第一条记录
在Java 9发布之前,我们来分享一些Java 8开发技巧 [以下为译文] 在使用JAVA 8进行开发多年后,结合个人使用IntelliJ IDEA的心得,我总结了以下几个JAVA8技巧供大家参考. ...
- Spoken English Practice (I'm having whatever you're having)
绿色:连读: 红色:略读: 蓝色:浊化: 橙色:弱读 下划线_为浊化 口语蜕变(2017/7/4) 英 ...
- 创建view,保存GROUP_CONCAT数据
create view user_account_view asSELECT u.userId UserId ,u.userCode UserCode,GROUP_CONCAT(ac.id) Acco ...
- Web Tracking
采集方式_数据采集_用户指南_日志服务-阿里云 https://help.aliyun.com/document_detail/28981.html http://docs-aliyun.cn-han ...
- linux库冲突解决方法 apt purge / aptitude purge
remove libs: [apt-get purge remove] or [aptitude purge] how to use apt-get and aptitude https://blog ...
- 我的Android进阶之旅------>解决:debug-stripped.ap_' specified for property 'resourceFile' does not exist.
1.错误描述 更新Android Studio到2.0版本后,出现了编译失败的问题,我clean project然后重新编译还是出现抑郁的问题,问题具体描述如下所示: Error:A problem ...
- Java-idea-生成JavaDoc
1.选中要生成的doc模块 2.选择Tools→Generate JavaDoc 3.填写一下信息 1. 选择是整个项目还是模块还是单个文件 2. 文档输出路径 4. 传入JavaDoc的参数,一般这 ...
- Mahout介绍-炼数
Mahout的中文含义:象夫
- Cpython-并发编程
阅读目录 一 背景知识 二 python并发编程之多进程 三 python并发编程之多线程 四 python并发编程之协程 五 python并发编程之IO模型 六 补充:paramiko模块 七 作业 ...
- 分页和Cookie、Session
分页和Cookie.Session 分页 自定义分页 函数班 from django.shortcuts import render # Create your views here. data = ...