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 thenprint("value is ", value)
elseprint("not exists")
end

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

结果如下:

先让程序跑起来,理解。

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

转载于:https://www.cnblogs.com/newbeeyu/p/5840829.html

lua笔记之userdata相关推荐

  1. Lua笔记-关于lua table的C API

    //Lua笔记-关于lua table的C API //转载请注明来自yuliying的CSDN博客. //Lua版本5.2 /*相关API: ====lua_createtable 原型: void ...

  2. lua笔记之local

    lua笔记之local 最近使用lua语言遇到一个小问题,这里要记录一下 lua 中使用 local 的变量,例如: function testLocal()print(a, b)a = 10086l ...

  3. lua中给userdata绑定元表示例

    前言 这篇博客,我估计写不好.一方面是内容挺绕,一方面是我没有看过书,是照葫芦画瓢写代码. 前置要求: Lua调用C代码 lua中表与元表 Lua操作C语言用户自定义类型数据Userdata 上面第三 ...

  4. lua笔记1 基础概念

    基础概念 Lua的变量默认是全局的,如果想要清除,只需要设置为nil.没有赋值的变量也是nil.注意lua是动态语言,变量不需要声明类型,而且自动类型转换. b = 1 print(b) b = ni ...

  5. Lua中的userdata

    userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct .指针和类)存储到 Lua 变量中 ...

  6. 脚本语言lua笔记(5)c++调用lua

    首先搭建环境,使用vs2010的c++开发工具,lua源码包,可以去官方下载最新源码包,我采用的是lua-5.1.5的版本.好了,开始配环境. 第一步: 下载源码包后,解压lua-5.1.5源码包到硬 ...

  7. Lua笔记——4.Package

    module简介: Lua 5.1 加入模块管理机制module,类似于Java的packages.C++的namespaces,可以通过require用于加载模块,module用于创建模块.requ ...

  8. Lua笔记4 闭包、迭代器

    闭包 首先,明确闭包的概念.个人理解,一个闭包是一个封闭的数据和状态集合,闭包在创建的时候,可以捕获包外的数据,然后在包内会有一个数据副本,闭包内数据的生命周期随着闭包的结束而结束.在lua中,闭包是 ...

  9. Lua笔记3 函数和数组

    函数 这里主要介绍可变参数函数,使用...表示可变参数函数. function add( ... )local s = 0for i, v in ipairs{...} do -- {...}表示可变 ...

最新文章

  1. 【组队学习】【27期】李宏毅机器学习
  2. 面试高频题:在数组中查找元素第一个和最后一个出现的位置
  3. envers_分代缓存和Envers
  4. 计算机如果算积分排名,超级电脑预测英超积分榜:蓝军守住第4 曼联无缘欧冠...
  5. MachineLearning(4)-核函数与再生核希尔伯特空间
  6. node.js全局对象和全局变量
  7. Linux运维新主机挂载硬盘,linux运维:Linux下添加新硬盘+分区及挂载详细步骤图解...
  8. Python提取docx文档中例题、插图、表格清单
  9. tcp码流中查找rtp头_跟踪数据流中的时间以查找性能问题
  10. 有向图的十字链表存储
  11. 魔方——操作阶数实验
  12. C++11 | 正则表达式(4)
  13. 算法:回溯和动态规划解决每次移动一步最终回到原地1269. Number of Ways to Stay in the Same Place After Some Steps
  14. 最近架设的MUNIN,WEBALIZER,AWSTATS截图存档
  15. 从零开始的LC刷题(56): Power of Two
  16. Android使用WebView播放flash的方法和JavaScript调用本地方法
  17. FAR花菜一个前所未有的机遇
  18. 服务器系统2008怎么安装net,如何在win2008R2 上安装.Net 3.5 sp1
  19. android+美拍加表情,美拍怎么添加表情文字在哪
  20. 拉链表断链、交叉链判断及处理方式

热门文章

  1. 为什么对流层散射通信距离远、容量大、_中级通信工程师|「专业实务」第9章重点学习内容!...
  2. 高性能mysql 小查询_高性能MySQL06-查询优化(慢查询)
  3. lua 函数 默认值_Unity热更新框架之xLua
  4. 20190910:(leetcode习题)FizzBuzz
  5. mysql cluster 数据文件_关于MYSQL CLUSTER数据文件存放节点错误问题 -问答-阿里云开发者社区-阿里云...
  6. android的视图动画,Android 视图动画(视图动画代码实现)
  7. php1500,圆周率1500多位
  8. 获取div中的内容写法
  9. 数据特征处理pca降维-小结
  10. 物联网核心安全系列——智能监控安全问题