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. 【BZOJ1951】[Sdoi2010]古代猪文 Lucas定理+CRT

    [BZOJ1951][Sdoi2010]古代猪文 Description 求$X=\sum\limits_{d|n}C_n^d$,$Ans=G^X (\mod 999911659)$. Input 有 ...

  2. Idea之Tomcat

    安装配置   启动 三种方式,run,debug,coverage       面板说明     上面一排 Debugger:debug模式的时候显示方法,调用关系,参数值等, Server:打印日志 ...

  3. C#连接EXCEL和ACCESS字符串2003及2007版

    97-2003版本 EXCEL Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件位置;ExtendedProperties=Excel 8.0;HDR=Y ...

  4. Learning How to Learn学习笔记(转)

    add by zhj: 工作中提高自己水平的最重要的一点是——快速的学习能力.这篇文章就是探讨这个问题的,掌握了快速学习能力的规律,你自然就有了快速学习能力了. 原文:Learning How to ...

  5. Angular4中常用管道(转载)

    Angular4中常用管道 通常我们需要使用管道实现对数据的格式化,Angular4中的管道和之前有了一些变化,下面说一些常用的管道. 一.大小写转换管道 uppercase将字符串转换为大写 low ...

  6. 《Redis官方文档》用Redis构建分布式锁

    用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简 ...

  7. android studio本地gradle

    1.从网站上下载http://services.gradle.org/distributions/ 2.打开工程里的gradle-wrapper.properties, distributionUrl ...

  8. C#简单实现动态数据生成Word文档并保存

    今天正好有人问我,怎么生成一个报表式的Word文档. 就是文字的样式和位置相对固定不变,只是里面的内容从数据中读取. 我觉得类似这种的一般用第三方报表来做比较简便.但既然要求了Word,只好硬着头皮来 ...

  9. samba、nginx服务

    一.部署samba Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成,Samba主要用于Linux或UNIX和Windows系统之间的文件共享. SMB( ...

  10. html基本标签介绍及应用

    <!-- html标签 特征: 1.空白折叠现象 2.对空格和换行不敏感 3.标签要严格封闭 p标签的嵌套 多注意!!!!!! html中: 1.行内标签(不换行) (1)在一行内显示 span ...