随笔分类 -  lua

摘要:官网地址:http://www.inf.puc-rio.br/~roberto/lpeg/ LPeg是一个为Lua所使用的新的模式匹配库,基于解析表达式语法(PEGs)。1.新建“Win32 Console Application”工程,工程名为:lpeg2.在“Application Set... 阅读全文
posted @ 2014-07-30 15:22 ghost&240 阅读(3543) 评论(0) 推荐(0) 编辑
摘要:最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运行十几次就会有一次启动时崩溃(Debug版本还没崩溃过),崩溃点也不固定。经过简单分析之后,确定是线程同步的问题。于是便修改了线程通信的代码,并使用pthread_mutex_lock/unlock来防止冲突。重新编译后,崩溃频率有所减少。但是每运行约四十次,还是免不了崩溃一次,而且冷启动时崩溃概率更大。在VC中的Release版本中设置Generate Debug Info后,重复多次运行程序,好不容易得到了几次崩溃记录。综合这几次的崩溃点,可以发现崩溃基本都发生在重分配内存(operator 阅读全文
posted @ 2014-01-19 20:49 ghost&240 阅读(6007) 评论(0) 推荐(1) 编辑
摘要:可以用这样的方法产生类似foreach的功能:function printargs(...) local num_args = select("#", ...) for i = 1, num_args do local arg = select(i, ...) print(i, arg) endend> printargs("alpha", "beta", "gamma")1, alpha2, beta3, gamma这个功能比之前的foreach实现方式(for i=1, #tbl do)有一个优点: 可以 阅读全文
posted @ 2014-01-14 11:29 ghost&240 阅读(382) 评论(0) 推荐(0) 编辑
摘要:偶遇一个事情,需要在C里面嵌入Lua代码,这真是痛苦了我好久….不知道为啥lua默认编译没有生成.so 的动态链接库,需要修改Makefile生成liblua.so,我用的版本是5.2一、先修改根目录的 Makefile修改一行TO_LIB= liblua.a liblua.so二、再修改src的Makefile注意,请搜索关键字,第二行是需要修改的,第一行,和第三行是粘贴的,至于粘贴的位置嘛,你看样子比较像的就粘贴一起吧第三行的开始是tab键LUA_SO=liblua.soALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)$(LUA_SO): $(COR 阅读全文
posted @ 2013-11-13 11:21 ghost&240 阅读(3935) 评论(0) 推荐(1) 编辑
摘要:LUA modue require package 区别2011-01-19 12:41:35|分类:默认分类|标签:luapackagemodulerequire加载|字号订阅【lua 5.1 的 module】lua 从 5.1 开始终于官方提供统一的 module 实现标准了,这是个值得庆幸的事。今天读了下相关的源码和文档,把这套机制搞清楚了,还是很巧妙的。从简洁这个角度看,要比 python 强 :)有一点容易被忽略掉(我的同事在用的时候就忽略掉了),module 指令运行完后,整个环境被压栈,所以前面全局的东西再看不见了。比如定义了一个 test 模块,使用module(" 阅读全文
posted @ 2013-08-22 17:55 ghost&240 阅读(608) 评论(0) 推荐(0) 编辑
摘要:先要将proto文件编译成.pb文件,然后再动态绑定实现lua protobuffer,这就需要了解云风做的pbc的项目,地址为:https://github.com/cloudwu/pbc/blob/master/binding/lua/README.md具体的方式是,下载pbc的项目;在pbc/binding/lua下面编译出protobuf.so放在LUA_PATH下面,或者将protobuf.lua放在LUA_PATH下,就可以调用protobuf中的库方法cd pbc/binding/luamake如果提示-fPIC-->删去pbc-master/build/o下的所有文件-- 阅读全文
posted @ 2013-08-12 16:03 ghost&240 阅读(10068) 评论(3) 推荐(0) 编辑
摘要:使用下面方式可保存lua任何值,目前只实现fucntion的保存,且无参数。如果需要实现参数,可自己扩展:可实现下面方式:CFun( lua_fun ) -- okCFun( function() print("Hello world") end ) --oklocal xxx = function print("Hello world" ) endCFun( xxx ) --oklua_value.h#ifndef __LUA_VALUE_H__#define __LUA_VALUE_H__extern "C" {#include 阅读全文
posted @ 2013-08-01 16:06 ghost&240 阅读(672) 评论(0) 推荐(0) 编辑
摘要:gcc编译gcc -I/usr/local/include/ -L/usr/local/lib/ -lm -o engine_mlisten_lua ./src/engine_mlisten_lua.c-levent -lpthread -ldl /usr/local/lib/liblua.aLua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性。对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数。对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFuncti 阅读全文
posted @ 2013-08-01 11:15 ghost&240 阅读(1012) 评论(0) 推荐(0) 编辑
摘要:X. 数组里面的元素可以是函数Q: lua_pushliteral和lua_pushstring有何区别?A: 通常在push字符串字面值时使用lua_pushliteral,在push字符串指针是使用lua_pushstring。 原因是前者通过sizeof(字符串字面值)/sizeof(char)计算长度,而后者通过strlen计算长度。 因此前者只能push字符串字面值,但速度比后者快。而后者既可push字符串字面值,也可push字符串指针。Q: luaL_loadfile, luaL_loadstring, luaL_loadbuffer的区别?A: luaL_loadfile把文件内 阅读全文
posted @ 2013-04-08 21:28 ghost&240 阅读(675) 评论(0) 推荐(0) 编辑
摘要:总结:不能用<=,不然会报错。当<与==拆分的时候,==(如果是最后一个if语句)必须要返回false。> tbl = {{4,1},{4,2},{3,3},{5,3},{5,1},{3,2},{5,4},{5,5},{5,1},{5,3},{3,3},{4,2},{3,2}}> function comp(a,b)>> if a[1] <= b[1] then>> return true>> else>> return false>> end>> end> table.sort(tbl 阅读全文
posted @ 2013-04-08 18:13 ghost&240 阅读(2817) 评论(0) 推荐(0) 编辑
摘要:"./test.lua" 31L, 565C 已写入 ghost@debian:~$ vim ./test.lua #!/usr/local/bin/luastr = [[123456,["Partner"]={[1]="1", [2]="2"}["Friend"] = {[1] = "123"}]]--str_start = '\["Partner"\]'--str_end = '\["Friend"\] 阅读全文
posted @ 2012-07-23 23:35 ghost&240 阅读(546) 评论(0) 推荐(0) 编辑
摘要:基本函数库为Lua内置的函数库,不需要额外装载assert (v [, message])功能:相当于C的断言,参数:v:当表达式v为nil或false将触发错误,message:发生错误时返回的信息,默认为"assertion failed!"--------------------------------------------------------------------------------collectgarbage (opt [, arg])功能:是垃圾收集器的通用接口,用于操作垃圾收集器参数:opt:操作方法标志"Stop": 停止垃圾 阅读全文
posted @ 2012-07-02 10:08 ghost&240 阅读(243) 评论(0) 推荐(0) 编辑
摘要:一部分的table函数只对其数组部分产生影响, 而另一部分则对整个table均产生影响. 下面会分开说明.table.concat(table, sep, start, end)concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认值是数组部分的总长. sep, start, end这三个参数是顺序读入的, 所以虽然它们都不是必须参数, 阅读全文
posted @ 2012-07-02 10:00 ghost&240 阅读(180) 评论(0) 推荐(0) 编辑
摘要:这个库通过表os实现os.clock ()功能:返回一个程序使用CPU时间的一个近似值例如:local x = os.clock();print(os.clock())local s = 0;for i = 1, 100000000 do s = s + i;endprint(string.format("elapsed time : %.2f\n", os.clock() - x));输出:0elapsed time : 2.55------------------------------------------------------------------------ 阅读全文
posted @ 2012-07-02 09:58 ghost&240 阅读(211) 评论(0) 推荐(0) 编辑
摘要:1、函数dofile()和loadfile():dofile():读入文件编译并执行loadfile():编译代码成中间码,并返回编译后的chunk作为一个函数,而不执行代码,并且不会抛出错误信息,而是返回错误码和nil;另外,运行一个文件多次的话,loadfile只编译一次,但可多次运行;dofile每次都要编译;dofile()本质上位辅助函数,真正实现其功能的是loadfile()loadstring()函数:他与loadfile相似,不过他读入的不是chunk,而是从一个串中读入;运行错误的话,也不会抛出错误,而是返回错误码和nil;loadstring和loadfile都不会产生边界 阅读全文
posted @ 2012-06-20 12:26 ghost&240 阅读(3050) 评论(0) 推荐(0) 编辑
摘要:在lua中写个试验性质的小程序可能只要一个脚本文件就搞定了,不过一旦程序上了一定规模,为了方便阅读和维护,分开多个文件就很有必要了。那么如何才能在一个lua脚本文件中调用另一个文件呢?这个就是今天的研究课题。 首先出场的就是dofile。我们知道一个lua文件是作为一个代码块(chunk)存在的,其实质就是一个函数,那么最简单的,我在一个外部lua文件中写一段代码,然后在主lua文件中用dofile调用,外部文件的代码块就会执行了。[python] view plaincopyprint?--outter.lua:print("Helloworld!")--main.lua 阅读全文
posted @ 2012-06-20 09:52 ghost&240 阅读(1840) 评论(0) 推荐(0) 编辑