- 博客(47)
- 资源 (3)
- 收藏
- 关注
原创 LUA学习(七) 元表和元方法
lua中可以对每个表进行操作,同时也提供了元表(metatable)概念,用来关联两个不同的表。如果用面向对象的思路来看,一个表的元表就相当于一个类的父类,有点继承的意思。有两个很重要的函数来处理元表:setmetatable(table, metatable) -->将metatable设置为table的元表getmetatable(table) -->获取table的元表示例代码
2016-05-05 18:11:41
537
原创 LUA学习(六) 协同程序
Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。线程和协同程序区别线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。
2016-05-03 19:25:02
3365
原创 LUA学习(五) 迭代器
在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。迭代器需要保存上一次的调用状态和下一次的调用参数。用闭合函数可以很好地实现这些要求,因为每个闭合函数可以很好地维护自身可以访问的外部变量。每个闭合函数必须由可供其访问的外部变量,而这个外部变量需要由其他函数提供,我们可以暂且把这些函数成为工厂函数。所以,一个典型的迭代器,主要由工厂函数和闭合函数组成。如:functi
2016-04-28 19:16:36
467
原创 LUA学习(四)函数
lua中函数主要有两种作用:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。函数的定义形式如下:
2016-04-28 11:49:55
544
原创 LUA学习(三) 基本语法
lua可以像c一样,几乎支持所有的传统的赋值语句、流程控制语句、函数调用等,同时也支持非传统的多变量赋值语句、局部变量声明等。赋值语句:可以使用传统的赋值语句,或者是lua支持的值格式,如:a ="hello" .. " world"b = 1print(a) -->hello worldprint(b) -->1lua支持对多个变量的赋值,在语句中,变量列表和值列表
2016-04-21 16:43:44
321
原创 LUA学习(二) 类型、表达式等基础要点
由于lua是一门动态类型语言,所以对于lua的变量,是不需要提前声明类型的。lua的变量在使用时才会确定它的类型。lua支持的类型有以下几种:nil、boolean、 number、string、userdata、function、thread 和 table。使用type函数可以用来测试变量的类型,如:t = 10print(type(t)) -- numbert = "hello
2016-04-20 18:38:06
482
原创 LUA学习(一) 初步认识lua
最近工作需要用到lua语言。于是在ubuntu环境下学习了下lua语言。首先了解下lua的几个概念。交互模式:在ubuntu的终端里,执行“lua”命令,就可以进入交互模式,显示‘>’,然后等待用户输入。chunk:代码块。lua可以执行的一段代码。在交互模式下,如果输入的一行lua指令如果符合lua的运行规则,则该行代码会被当做一个chunk;如果不能被运行,在输入回车后,交
2016-04-20 12:08:42
332
原创 编写可读代码的艺术 (12)
第十二章 把想法变成代码用“自然语言”向他人解释一个事情时,会容易的多。这需要我们将复杂的想法精炼成一个最重要的概念。这不仅有助于他人理解,也可以让我们把自己的想法变得更加清晰。编码过程也应使用同样的技巧,毕竟代码是解释我们程序的最根本方法。清楚地描述逻辑下面是一段PHP代码,它检查是否授权用户看到这个页面,如果没有,马上返回一个页面来告诉用户他没有授权:$is_admin
2016-03-29 12:16:39
524
原创 编写可读代码的艺术 (11)
第十一章 一次只做一件事在阅读代码时,如果一段代码中做了很多的工作,比如初始化数据,清理数据,解析输入,还包括了一些应用业务逻辑,所有这些都同时进行。如果你看到这样的代码,会不会觉得晕呢?你需要自己分析这段代码中完成了哪些任务,某一个任务是从哪开启的,又会在哪结束。编码过程中,应该时刻遵守“一次只做一件事”原则。我们在日常生活中,也常常被教导,做事要有先后,一件一件的来。这也符合我们思
2016-03-28 15:56:27
423
原创 编写可读代码的艺术 (10)
第十章 抽取不相关的子问题编码在初级阶段的时候,往往把一大堆代码写在一个函数里。慢慢的经验多了,就开始注意写子函数了。要如何写子函数呢?就是这章的重点。这儿主要关注如何积极地发现并抽取出不相关的子逻辑。1、介绍性的例子下列函数的高层次目标是“找到距离给定目标最近的位置”://return which element of 'array' is closest to the give
2016-03-28 12:29:48
304
原创 编写可读代码的艺术 (9)
第九章 变量与可读性 前面说了“解释变量”和“总结变量”的好处,他们可以把巨大的表达式拆开,并作为某种形式的文档。但是并不是所有的变量都能达到这个效果。我们这样做并不是为了多多引入变量,而是为了提高可读性。相反,有很多变量并不能显著地提高代码的可读性。对于这样的变量,我们需要舍弃他们。变量越多,就越难全部跟踪它们的动向。变量的作用域越大,就需要跟踪它的动向越久。变量改变得越频繁,就
2016-03-25 17:10:35
298
原创 编写可读代码的艺术 (8)
第八章 拆分超长的表达式一行代码中含有的表达式越长,它就越难以理解。注意把超长的表达式拆分成更容易理解的小块。1、用作解释的变量拆分表达式最简单的一个办法就是引入一个额外的变量,让它来表示一个小一点的子表达式,姑且把这个小变量叫做“解释变量”吧,因为它可以解释子表达式的含义。if line.split(':')[0].strip() == "root" ...如果初次看这段
2016-03-24 18:08:40
334
原创 编写可读代码的艺术 (7)
第二部分 简化逻辑和循环代码中总是存在逻辑处理和流程控制语句。当你看到一个负责的逻辑、一个巨大的表达式或是一大堆变量的时候,是不是还有耐心仔细地读下去。刚刚提到的这些,都会增加阅读者头脑中的思维包袱。它需要我们考虑得更复杂并且要记住好多事情。这恰恰与可读性要求的“易于理解“是相反的。这其中隐藏的bug也是难以发现的。第七章 把控制流变得易读代码如果写的像平时说话一样,那理解起来就好多了
2016-03-23 15:16:06
316
原创 编写可读代码的艺术 (6)
第六章 写出言简意赅的注释上一章主要介绍了要在哪些地方写注释,这一章着重介绍下如何写出言简意赅的注释。在添加注释时,尤其需要注意的一点就是,注释应该有很高的信息/空间率。应该尽量把它写的精确细致,由于注释也会占用屏幕空间,所以注释也要努力写地很紧凑。1、让注释保持紧凑先看下一个典型C++类型的注释://the int is the CategoryType//the first
2016-03-22 18:38:52
310
原创 编写可读代码的艺术 (5)
第五章 该写什么样的注释注释是代码的辅助和补充。很多人都觉得,注释就是解释代码做了什么。没错,但是注释能做的,可不仅仅是这么点。我们写代码时,脑海中会有很多有价值的信息,这些都对理解这段代码有很大的帮助。但是当编码完成时,展现在阅读者面前的,很多时候只剩下代码了,当时在编码者脑海中的那些有用信息全都不见了。阅读者只通过阅读代码的话,很可能理解的不够全面,即使这个阅读者就是几个月以后的编码者
2016-03-21 17:47:39
345
1
原创 编写可读代码的艺术 (4)
第四章 审美好的源代码应该看上去就养眼。好多公司在编码规范上都要一致,为的就是能使整个源代码看上去整洁,有条理,这样的代码,阅读起来更加方便。在对代码进行审美方面的改造时,可以遵循以下几个原则:a、使用一致的布局 b、让相似的代码看上去相似c、把相关的代码行分组,形成代码块。1、重新安排换行来保持一致和紧凑先来看下下面的这个例子,一个类的构造函数有四个参数:网络连接
2016-03-20 17:23:33
334
原创 编写可读代码的艺术 (3)
第三章 不会误解的名字1、避免使用可能会引起歧义的名字变量或是函数的名字往往是代码的最直接的注释,如果名字存在二义性,阅读者往往会走进错误的逻辑里面。生活中也常见这样的例子,比如下列的对话:“不是右边的线,是吧?”“是得,不是”。这样的对话生活中常常出现,虽然联系前后的语境还能分辨出来,但是往往需要在思维中绕个圈,一不留神就容易陷入迷惑。我们在代码中想要达到方便阅读的话,就应该避免
2016-03-20 16:23:51
329
原创 编写可读代码的艺术 (2)
第一部分 表面层次的改进代码的可读性最直观的表现就是在表面层次上,比如良好的格式,好的变量、函数名字,合理的注释等等。这些地方很容易修改,应用起来比较方便,所以学习编写可读代码的艺术,首先从表层入手,打造一个优美的颜值。第二章 把信息装进名字里在编码过程中,不论是变量还是函数,如果可能的话,代码应该越少越好,应该让变量和函数通过名字达到自注释的能力,这就要求我们,要把信息装进名字中。
2016-03-18 19:38:34
317
原创 编写可读代码的艺术 (1)
最新在看《编写可读代码的艺术》,不得不说,从这本书里学习到了许多好的编码习惯,本着对自己负责的态度,在这里记录下。这本书给我最深的一个感受是,代码是给人看的,不是单单为了机器阅读。可能早些时候,机器的性能不是很好,编译速度慢,程序员需要费劲心机地编写充满技巧的代码来提高程序的运行速度和执行效率。但是随着科技的发展,程序运行效率等关键参考点的制约因素已经不在是笨重机器或者是低效编译器了。作为程序
2016-03-18 18:23:30
396
转载 QNX常用命令
0.#use -- Print a usage message (QNX Neutrino)(查看各命令帮助)#use ls1.#pidin -- Display system statistics (QNX Neutrino)(查看系统信息)#pidin a #pidin mem #pidin info #pidin fa ..
2015-05-18 12:22:14
1558
原创 VMware识别虚拟磁盘出错的解决
工作中,需要拷贝虚拟机。有时候拷贝虚拟机完成后,在开启的时候会出现虚拟磁盘不能识别的问题,具体的错误信息如下:“the file specified is not a virtual disk“我们在虚拟机文件目录下,可以看到很多的.vmdk文件,这个就是虚拟磁盘。例如:virtual-Ubuntu-s001.vmdk, virtual-Ubuntu-s002.vmdk等等。我们在虚拟
2015-05-14 17:25:03
23662
原创 列表解析与生成器表达式
最近在学习python的过程中,对列表解析及生成器表达式有点疑惑。从表面上看,两者很相似,只有一点不同:列表解析采用中括号[]来包含,生成器表达式采用小括号()来包含。两者都可以用来动态的创建列表,但是本质上又有些不同。先来看下列表解析:列表解析可以用来修改一个列表,或者是动态的创建一个列表。它的表达式为:[expr for iter_var in iterable] or
2015-04-21 14:38:57
1851
转载 python zip()
zip([iterable, ...])zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压)。示例:>>> a = [1,2,3]>>>
2015-04-21 09:48:06
1050
转载 Python入门
重要说明这不是给编程新手准备的教程,如果您入行编程不久,或者还没有使用过1到2门编程语言,请移步!这是有一定编程经验的人准备的.最好是熟知Java或C,懂得命令行,Shell等.总之,这是面向老鸟的,让老鸟快速上手Python教程.为什么总结这样的一个教程我虽不是老鸟,但已熟悉Java,C/C++, Shell和Perl,且对常见的数据结构和算法等都了解.最近因项目需要,要做一个小工具
2015-04-09 18:09:07
537
原创 预处理
#if 0#define FIVE 5#define SIX 6#define TEEE#if defined TEEE# if FIVE > SIX# define INIT_CACHE(cache) {.flag = 2}# elif FIVE < SIX # define INIT_CACHE(cache) {.flag = 1}# e
2015-04-09 10:53:51
348
原创 几个typedef的使用
mac类型数据:typedef char mac_bin_t[8];typedef char mac_str_t[16];函数指针:typedef int(*msg_callback_t)(void *, int*);备忘。
2015-04-07 11:48:41
399
原创 C语言结构体的静态赋值
最近对结构体静态赋值主要使用以下方法,struct usr_cache{ int limit; char *name;};struct usr_cache my_cache = { 100, "my_cache",};或者struct{ int limit; char *name;}my_cache = { 100,
2015-04-07 11:20:01
4442
转载 过桥时间问题
一盏灯只能亮30秒,每次可两人过桥。五个人过桥的时间分别是1秒、3秒、6秒、8秒、12秒。两人过桥后应有一人将灯带回原岸,然后才能继续过桥。两人一起过桥时间以长的一位计算。是否能全部过桥。以过桥时间来代表过桥的人1和3过桥1回3留下 耗时3+1=4秒 8和12过桥3回8和12留下 耗时12+3=15秒1和6过桥1回6留下 耗时6+1=7秒1和
2015-03-24 17:12:42
1647
转载 飞机加油问题
条件:(1)每个飞机只有一个油箱,(2)飞机之间可以相互加油(注意是相互,没有加油机)(3)一箱油可供一架飞机绕地球飞半圈,问题:为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场)答案:三架飞机,共起飞五架次。解析:这道题在网上流传了很久了,
2015-03-24 17:08:00
495
转载 猴子搬香蕉问题
一个小猴子边上有100根香蕉,它要走过50米才能到家,每次它最多搬50根香蕉,(多了就被压死了),它每走1米就要吃掉一根,请问它最多能把多少根香蕉搬到家里。(提示:他可以把香蕉放下往返的走,但是必须保证它每走一米都能有香蕉吃。也可以走到n米时,放下一些香蕉,拿着n根香蕉走回去重新搬50根。)看了很多文章。好像分析的不是很清楚。只好自己动手了。解析:这种试题通常有一个迷惑点,让人
2015-03-24 17:06:25
1038
原创 插入排序、希尔排序、堆排序、归并排序、快速排序
以下排序都从小到大排序,假设数列均为整数数列。先从插入排序说起吧,插入排序是最基础的排序了,估计大学都讲烂了。插入排序基本思想是将一个元素插入到已经排序的数列中,从而得到一个新的个数加1的序列。所以对一队无序序列进行插入排序,可以从第二个元素开始,依次插入前面的序列中,第一个元素可以看作是一个个数为1的有序序列。源码如下:void insertionsort(int array[]
2015-03-24 16:54:18
444
原创 AT&T汇编leave学习
最近在看c程序的编译出来的汇编文件,发现涉及到函数调用的地方,在返回时有的时候使用的leave,有的时候直接使用的是popl %ebp。在AT&T汇编中,leave等效于以下汇编指令:movl %ebp, %esppopl %ebp为什么有的时候会使用leave,有的时候直接使用popl %ebp?这个问题一开始我也没搞懂,后来通过分析堆栈才有点清醒。二者的差别就在于是否使用
2014-03-07 11:24:01
2407
转载 Linux写时拷贝技术(copy-on-write)
源于网上资料,转载。COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。 那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢? 在f
2014-02-21 11:20:09
544
原创 数组的引用
main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);}这个是1987年C语言混乱代码大赛获奖作品。汗。。这个代码比我年纪还大。。时至今日,这个代码依然有分析的价值。这个代码中使用了C里面很细微地一个技巧,就是数组引用的不同方式。我们通常对数组元素进行引用,一般都是通过a[i]或是*(a+i
2012-12-26 22:31:45
505
原创 memset研究
在工作上开发的时候遇到了一个关于内存的问题。程序总是会莫名其妙的崩溃掉,后来定位到了是内存处理方面的问题,原来是memset出的错。代码中有这样的语句,memset(src, 0 ,512);但是这个src指针指向的内存并没有512个字节,导致程序崩溃。后来查资料,做测试才找到问题原因。上面的语句在编译运行的过程总是不会产生任何警告或是错误的,程序会按照语句的意思完完全全的
2012-12-23 16:28:58
452
原创 字符常量类型
最近看书发现有对字符常量的警告,在这记下来,常常提醒下自己。字符常量就是用单引号括起来的单个字符,一般情况下是这样了。字符常量在内存中占用一个字节,用来保存字符的ASCII码,不过如果不对字符常量进行保存,直接对其进行操作,C语言规定对字符常量按照整型量来处理。这样说估计不直观,看个简单的例子吧。int main(void){char a = 'a';printf(
2012-12-23 15:42:01
1031
原创 mac地址转换为6字节数组--strtoul函数
最近工作中需要在网络中传递mac地址,需要将mac地址转换为六个字节,网上找了找资料,基本的思路就是用根据冒号将mac地址分为六段, 每段看做一个十六进制数,转化为十进制数后,分配赋值给六字节数组的每一位。后来在查看库函数的时候,发现了strtoul函数,发现这个函数正好可以用来实现这个功能。实现函数如下:int mac_str_to_bin( char *str, char *m
2012-12-16 00:40:03
14386
2
原创 指针出参探究
最近在写一段函数的时候发现了一个关于指针出参的问题,当时情况是这样的,我打算将形参声明为char型指针,在被调用函数中为该指针分配空间。由于设计的需要,并不会将地址作为返回值,而是需要通过出参来达到取得地址的效果。示例代码如下:int getPoint(char *src){ src=(char *)malloc(100); if(NULL == src)
2012-12-08 22:42:03
1309
原创 __attribute__((packed)) 学
最近在看linux源码的时候,发现在底层的结构体设计中,经常用到__attribute__((packed)) 参数。刚开始有些不懂,碰巧工作中在做底层方面的设计,对这种设计也有需求,所以就在网上查了些资料,总算有点了解 。struct test_s{ char reg; int test2; char test1;}__att
2012-12-06 23:59:18
744
原创 可变参数的宏
最近项目刚刚开始做,框架刚刚搭好。发现了一些以前不太熟的打印信息宏,用来调试和记录日志。其中有一种可变参数的宏,自己以前还没有认真的学习过,正好趁着这个机会好好的了解下。这种可变参数的宏定义形式如下:#define DEBUG_ERR(msg, args...) printf(msg, ##args)测试程序如下:int main(int argc, char* arg
2012-12-05 00:45:57
455
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人