C
文章平均质量分 77
cdai
这个作者很懒,什么都没留下…
展开
-
十年之后重学C语言
十年之后重学C语言1.每个程序员都该有本翻烂的K&R1.1 多次自学,不得其法距离大学时学习C语言已有十个年头了。印象里最深的就是当时一位海归老师,在讲课时流露出对K&R的崇敬之情,以及用Hanoi塔的例子讲解递归。但当时的我还无法体会,也只是不走心的听听。那时的我还不知道K&R有多牛,递归有多重要。十年间经历了很多项目,也业余时间自学了很多东西。温习过C、自学过汇编、尝试操作系统内核。看过不少推荐原创 2016-06-11 02:30:58 · 13649 阅读 · 10 评论 -
《Windows游戏编程大师技巧》三、Windows高级编程
Windows编程很绝的地方在于:你不用了解太多细节,就可以完成很多工作。使用资源资源就是你的程序代码结合在一起的多块数据,可以被程序本身在运行时加载。资源应当也放在程序的.EXE文件中的原因是:1.同时包含代码和数据的.EXE文件更容易发布。2.外力不容易任意删改程序的数据文件(如.BMP和.WAV文件)。对于想编译进程序中的数据类型没有限原创 2012-04-18 21:40:34 · 3403 阅读 · 0 评论 -
《Windows游戏编程大师技巧》 四、GDI、控件和突发奇想
本章是纯粹讲述Windows编程的最后一章。谢天谢地!高级GDI绘图GDI比起DirectX来实在太慢了,那为什么还要了解?1.GDI功能很全,并且是Windows与生俱来的渲染引擎。2.如果想创建任何工具或标准应用程序,都要用到GDI。3.GDI与DirectX混合使用,来仿真DirectX尚未实现的函数。到底什么是图形设备描述表?原创 2012-04-22 09:11:33 · 3038 阅读 · 0 评论 -
《Windows游戏编程大师技巧》五、DirectX基础知识和令人生畏的COM
所有的DirectX组件都是以COM实现的,两者环环相扣。DirectX基础DirectX可能会让身为程序员的你丧失些对硬件的控制能力,但是DirectX比Windows系统自带的GDI或MCI快上很多倍,并且也更稳定。在编写Windows游戏的过程中,使用DirectX的方法要干净和优雅得多。你只要向DirectX发出命令,它就会帮你处原创 2012-04-29 21:40:40 · 3749 阅读 · 2 评论 -
《算法导论》第15章 动态规划 (1)装配线调度
动态规划通常用于有很多种可行解,而找出最优解的问题。具体可分为4个步骤:1)描述最优解的结构。2)递归定义最优解的值。3)自底向上计算最优解的值。4)由最优解的值构造出最优解。下面通过一个具体问题来看究竟如何用动态规划算法来解决问题。Colonel汽车公司在有两条装配线的工厂里生成汽车。每一条装配线上有n个装配站,两条生产线上相同位置的装配站原创 2012-04-14 08:56:10 · 3465 阅读 · 2 评论 -
《算法导论》第14章 数据结构的扩张 (2)
在上一节中,我们为树结点添加size域表示每颗子树的大小,即包含的结点个数,扩张了二叉查找树为其增加顺序统计量的查找功能。更为自然的想法是直接添加顺序统计量rank域到每个树结点上。这一节我们就来看下在这样的设计下,如何扩张来完成上一节相同的功能。当我们插入一个结点到二叉树中,假设它的顺序统计量为5,那么之前二叉树中顺序统计量大于5的结点都要更新。也就是说插入一个新结点到对原创 2012-04-09 23:03:38 · 2627 阅读 · 0 评论 -
《算法导论》第14章 数据结构的扩张 (1)动态顺序统计
《数据结构扩张》是《算法导论》第三部分的最后一章。在介绍学习了这么多种数据结构之后,简要介绍了当这些基本数据结构不满足需求时,如何扩张它们来满足需求。这才是学习算法的目的,能够根据需求选择合适的数据结构和算法,并在无法满足需求时能够扩张它。这才是对算法的思想和本质的学习!可以将本章看做深入学习的前奏吧,因为紧接着就要开始进入第四部分《高级设计和分析技术》了。那么赶快来看原创 2012-04-08 17:57:59 · 3085 阅读 · 1 评论 -
《Windows游戏编程大师技巧》一、学海无涯
偶然发现了本很棒的游戏编程入门书 - 《Windows游戏编程大师技巧》。说是大师技巧,其实还是很深入浅出的。它涵盖了Windows图形编程的方方面面,从Win32的Helloworld程序,到GDI简介,再到DirectX的API。很适合我这种Windows编程的菜鸟,所以很喜欢这本书的内容。觉得这本书好的另一个原因是:虽然内容丰富,但没有涉及Windows编程比较繁琐的地方原创 2012-04-07 12:06:52 · 4957 阅读 · 7 评论 -
小小程序员的学习计划
追过很多新技术,迷茫于还有太多东西要学,有些找不到方向、不知所措。常在一个叫酷壳的网站上转悠,渐渐想明白了,其实学习技术也像看电影看书一样,要看就看经典的。我们的生命如此短暂,作为程序员的职业生涯可能会更短。与其追逐各种新潮的技术,不如把有限的精力投入到经典的技术之中。平时酷爱看各种技术书籍,但缺乏系统的梳理。读书感悟都散落在每本书的字里行间和空白处。于是借着准备从最经典、最基础知识学原创 2011-11-27 22:15:54 · 13226 阅读 · 18 评论 -
《算法导论》第11章 散列表 (3)开放寻址
前一节介绍是最简单的冲突解决方法-链接法。开放寻址与链接法不同,所有元素都放在散列表内。在这种方法中,散列表可能会被填满。开放寻址不需要指针,只需要计算出要存取的各个槽。由于不用存储指针而节省的空间可以提供更多的槽。有三种技术常用来计算开放寻址法中的探查序列:线性探查、二次探查和双重探查。下面的实现中,三种方法的差别只在计算探查序列的那一行代码。#include原创 2012-03-12 21:34:38 · 2900 阅读 · 0 评论 -
《算法导论》第11章 散列表 (2)散列表
用散列表来解决直接寻址表的那两个问题。但由此带来的散列值的碰撞问题。最简单的解决方法是链接法,以及下一节介绍的开放寻址法。链接法,即把散列到同一槽中的所有元素都放在一个链表中。链表是无序的,在查找一个元素时需要遍历链表。对于删除函数,假如参数是要删除的结点,那么如果链表是双向的,删除操作可以O(1)内完成。在下面的删除函数中,参数是关键字,这样更为方便。#i原创 2012-03-10 23:05:10 · 2324 阅读 · 2 评论 -
关于算法学习的总结和感悟(原创)
时隔一年重读《算法导论》,去年读到了二叉查找树就搁浅了,今年从头捡起,希望能走的更远一些。算上大学时的数据结构与算法课,今年可以算是第三波学习攻势了。随着学习的深入,对算法的学习渐渐有了些自己的看法和感悟。一.为什么学习算法?记得初学算法时不明白为什么费力分析程序的执行步骤后,还要用公式表达出来并求极值。一遍遍的学习渐渐有了领悟:算法研究是用来做大事的!原创 2012-03-26 22:43:43 · 11302 阅读 · 2 评论 -
《算法导论》第12章 二叉查找树 (3)基数树
基数树与二叉查找树和Trie树很相似。它像BST一样是二叉的,向左表示0而不是BST的小于,而向右则表示1而不是大于。它像Trie一样共享相同的结点来保存字符串中相同的前缀,从而节省了空间,但它不像Trie那样每个结点有很多孩子(可以是26个,表示a到z),它用来处理只包含0和1的字符串。基数树和Trie都用来保存和排列字符串,那么现在来看看字典序,关于字典原创 2012-03-25 13:38:00 · 7483 阅读 · 5 评论 -
《Windows游戏编程大师技巧》二、Windows编程模型
这一章开篇语对我有很大的启迪,一直对Windows下编程有着畏难心理。太庞大的平台和体系,太多的API和术语,太快的技术换代节奏,而我是个想要把握住本质掌握住基础才会有安全感和成就感的程序员,所以我只乐于学习Win32 API。而现在受到这本书的启发,对Windows编程的畏惧少了一些,也有了一些学习计划:1.窗体界面 -> Win32\MFC (简单了解界面消息处理机制吧原创 2012-04-14 15:26:54 · 4017 阅读 · 0 评论 -
《Windows游戏编程大师技巧》 T3D游戏控制台程序实例及第一部分总结
现在我们要创建一个Windows外壳程序,将单调的Windows运行细节隐藏,Win32/DirectX编程就变得类似于32位DOS的编程过程。在构建好的代码结构下,我们只需关心Game_*几个有关游戏逻辑的方法就行了。1.Game_Init()Game_Init()在WinMain()中的主事件循环之前被调用,并且仅调用一次。它用于初始化游戏所原创 2012-04-22 15:20:14 · 3400 阅读 · 1 评论 -
C实战:项目构建Make,Automake,CMake
C实战:项目构建Make,Automake,CMake在本系列文章《C实战:强大的程序调试工具GDB》中我们简要学习了流行的调试工具GDB的使用方法。本文继续“C实战”的主题,对同样非常流行的构建工具Make的用法和原理一探究竟,并顺便看一下一些高级衍生产品。1.Make基础首先我们编写一个简单的C项目,以此项目在实战中学习Make的相关知识。更全面的介绍请参考官方手册。cdai@vm /syspa原创 2015-10-08 20:51:12 · 9795 阅读 · 0 评论 -
用Qt开发简单的浏览器(一)
1.代码实现工程目录结构如下:AddressBar类包含了地址栏和按钮两个控件,将地址栏回车和按钮点击信号与goToSite()槽连接。当回车和点击事件发生时,goToSite()将获得Url地址并发送go(QUrl)信号。addressbar.h#ifndef ADDRESSBAR_H#define ADDRESSBAR_H#in原创 2012-05-20 09:00:04 · 43637 阅读 · 136 评论 -
用Qt开发简单的浏览器(二)
一、功能改进经过对QtWebKit的一些学习,对之前的浏览器进行一些改进:1.增加分页显示多个网页的功能。每个分页都是一个QWebView控件,实现对多个网页的加载。2.加入欢迎主页。学习如何创建Qt资源文件,从本地读取欢迎主页的HTML。3.添加了前进Forward和后退Back按钮。4.此外还明确了SIGNAL和SLOT的命名,SLO原创 2012-05-24 22:47:38 · 23052 阅读 · 226 评论 -
C实战:强大的程序调试工具GDB
C实战:强大的程序调试工具GDB1.基本调试这里只列举最最常用的GDB命令。1.1 启动GDBgdb program:准备调试程序。也可以直接进入gdb,再通过file命令加载。1.2 添加断点b function:为函数设置断点。b是break的缩写,除了函数名,还可以是地址、当前执行处的+/-偏移等。1.3 运行程序run args:开始运行程序,run后面可以加程序需要的参数,就像在命令行正常原创 2015-06-12 21:21:02 · 6604 阅读 · 0 评论 -
CSAPP缓冲区溢出攻击实验(上)
C实战:CSAPP缓冲区溢出实验(上)下载实验工具,最新的讲义在这。网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上。不过没有关系,大体上只是程序名(sendstring)或者参数名(bufbomb -t)的差异,不影响我们的实验。1.实验工具1.1 makecookie后面实验中,五次“攻击”中有四次都是使你的cookie出现在它原本不存在的位置,所以我们首先要为自己产生一个co原创 2015-06-05 21:55:59 · 15878 阅读 · 1 评论 -
六星经典CSAPP-笔记(11)网络编程
六星经典CSAPP-笔记(11)网络编程参照《深入理解计算机系统》简单学习了下Unix/Linux的网络编程基础知识,进一步深入学习Linux网络编程和TCP/IP协议还得参考Stevens的书。1.网络基础(略过,待补充)2.IP地址2.1 IP地址的表示IP地址是一个无符号的32位整数。Linux网络程序使用下面这种IP地址结构存储IP地址:/* Internet address structu原创 2015-05-15 21:48:54 · 4193 阅读 · 0 评论 -
程序员的“机械同感”
偶然在Martin Flower的博客上看到了一篇讲述LMAX架构的博文,里面有一小块提到了“机械同感”Mechanical Sympathy(不知道该怎么翻译好)。恰逢最近正在看第二版的CSAPP(Computer System: A Programmer Perspective,深入理解计算机系统),感慨万千!“机械同感”(mechanical sympathy)来自于赛车比赛,它反映了车手对原创 2014-12-06 21:18:34 · 2948 阅读 · 0 评论 -
六星经典CSAPP笔记(1)计算机系统巡游
CSAPP即《Computer System: A Programmer Perspective》的简称,中文名为《深入理解计算机系统》。相信很多程序员都拜读过,之前买的旧版没有读完,如今恰好第二版出版,就入手影印版重读经典。一读果然,经典依然是经典,CMU卡内基梅隆大学的本科教材,堪比另一本SICP的六星佳作啊!1.A Tour of Computer System1.1 Programs Ar原创 2014-12-06 21:44:11 · 4125 阅读 · 1 评论 -
PSP应用开发入门
一、PSP平台介绍硬件架构SDK官方的SDK网上找不到,可能是收费的,我们可以使用第三方的SDK。据网上介绍,一般有两种方法:psptoolchain+cygwin;devkitpro(不需要cygwin)。这里采用第二种方法。开发语言devkitpro中自带的SDK中都是C语言的头文件和库文件,所以使用C语言进行开发原创 2012-06-25 17:32:59 · 3059 阅读 · 0 评论 -
《C++ GUI Qt4编程》第一章、Qt入门
1.1 Hello Qt创建hello目录,新建源文件hello.cpp:#include #include int main(int argc, char *argv[]){ QApplication app(argc, argv); QLabel *label = new QLabel("Hello Qt!"); label->show(原创 2012-05-19 22:26:34 · 3552 阅读 · 2 评论 -
学习Google Chrome源码
读《Google Chrome源码剖析》笔记,学习Chrome中优秀的设计思想。原文地址:http://www.ha97.com/2911.html零、【序】1.关于开源“开源是口好东西,它让这个充斥着大量工业垃圾代码和教材玩具代码的行业,多了一些艺术气息和美的潜质。它使得每个人,无论你来自米国纽约还是中国铁岭,都有机会站原创 2012-06-02 09:52:23 · 13880 阅读 · 2 评论 -
LPDIRECTDRAW7编译错误的解决方法
用DirectX 7.0 SDK开发,编译时碰到了以下错误:syntax error : missing ';' before identifier 'lpDD'error C2501: 'LPDIRECTDRAW7' : missing storage-class or type specifiers打开工具->选项,工程已经包含SDK的Include和Lib文件夹,原创 2012-05-09 22:58:41 · 5049 阅读 · 7 评论 -
《算法导论》第12章 二叉查找树 (2)查找、插入与删除
1. 查找利用二叉查找树左小右大的性质,可以很容易实现查找任意值和最大/小值。BSTNode * bst_search(BSTNode *node, int key){ while (node && key != node->key) { if (key key) node = node->left;原创 2012-03-25 11:48:49 · 7966 阅读 · 2 评论 -
《算法导论》第11章 散列表 (1)直接寻址表
(一)直接寻址表关键字集合U = { 0, 1, ..., m - 1 },实际的关键字集合K。用一个数组T[0..m - 1],其中每个位置对应U中的一个关键字。直接寻址表的问题:(1)如果U很大,要保存|U|大小的一张表T有点不实际。(2)实际存储的关键字集合K相对U来说可能很小,因而分配给T的大部分空间都要浪费掉。原创 2012-03-07 22:54:58 · 4695 阅读 · 7 评论 -
学习编程的方法、软件和工具
编程的学习跟许多其他技艺的学习一样,首先必不可少的就是理论基础,其次就是需要大量的、不断地练习。老生常谈,这也许是每个人都懂得的道理,但说起来容易做起来难。所以想要学好编程,还需要些方法和毅力才行。对于编程来说,理论阶段的学习相对比较抽象。过早地就希望一口气掌握所有理论知识然后再开始实践,往往会越学越迷茫。因此从大的方面来说,比较好的方法是理论学习-实践-总结-理论学习-实践.....原创 2011-12-13 21:28:42 · 7382 阅读 · 6 评论 -
《C程序设计语言》 第三章 控制流
3.1 语句与程序块在表达式之后加上一个分号(;),它们就变成了语句。用一对花括号“{”与“}”把一组声明和语句括在一起就构成了程序块,在语法上等价于单条语句。3.2 if-else语句每个else与最近的前一个没有else配对的if进行匹配。if (n > 0) if (a > b) z = a;e原创 2011-12-04 19:50:01 · 2645 阅读 · 0 评论 -
初级程序员的书单
今年开始很少买书了,开始省钱看电子书了(去年花了一千多 ...)。下面分类总结了下我的书单。一. Java基础Java编程思想:对基础知识讲解比较深入,像容器一章不仅是介绍API还对实现容器的数据结构进行了解析。Core Java:上下两册很厚很全面,其中像JDBC4、操作XML还有一些JDK6特性为《Java编程思想》提供了补充。原创 2011-12-01 21:33:53 · 4783 阅读 · 2 评论 -
深入学习有趣的位运算
在最近学习C语言,接触到不少底层知识。之前一直用Java开发,很少会用到像位运算这样的操作。通过C语言的学习,才发现位运算真是奇妙,除了简单的类似位反转等基本操作,还可以加密编码,交换变量值,甚至在磁盘阵列RAID中都有它的身影。每个位运算的问题,都像在设计一套集成电路一样有趣。让我们一起来领略下有趣的位运算吧!1. 从布尔代数说起布尔代数定义了与、或、原创 2011-12-02 22:39:15 · 5633 阅读 · 0 评论 -
《C程序设计语言》 第二章 类型、运算符与表达式
ANSI标准对语言的基本类型与表达式做了许多小的修改与增补。所有整型都包括signed(带符号)和unsigned(无符号)两种形式。浮点运算可以以单精度进行,还可以使用更高精度的long double类型运算。字符串常量可以在编译时连接。ANSI C还支持枚举类型。对象可以声明为const类型,表明其值不能修改。2.1 变量名名字是由字母和数字原创 2011-12-01 22:37:52 · 5311 阅读 · 0 评论 -
《Linux C一站式编程》第八章 数组
1. 数组的基本概念数组(Array)也是一种复合数据类型,它由一系列相同类型的元素(Element)组成。int count[4];和结构体成员类似,数组count的4个元素的存储空间也是相邻的。结构体成员可以是基本数据类型,也可以是复合数据类型,数组中的元素也是如此。根据组合规则,我们可以定义一个由4个结构体元素组成的数组:struct complex_stru原创 2011-11-27 14:57:45 · 3241 阅读 · 0 评论 -
《Linux C一站式学习》第七章 结构体
1. 复合类型与结构体在编程语言中,最基本的、不可再分的数据类型称为基本类型(Primitive Type),例如整型、浮点型;根据语法规则由基本类型组合而成的类型称为复合类型(Compound Type),例如字符串是由很多字符组成的。struct complex_struct { double x, y;};struct complex_stru原创 2011-11-27 14:57:05 · 3318 阅读 · 0 评论 -
《Linux C一站式学习》第三章 简单的函数
4. 全局变量、局部变量和作用域全局变量定义在所有的函数体之外,它们在程序开始运行时分配存储空间,在程序结束时释放存储空间,在任何函数中都可以访问全局变量。如果全局变量和局部变量重名了会怎么样呢?例 3.6. 作用域则第一次调用print_time打印的是全局变量的值,第二次直接调用printf打印的则是main函数局部变量的值。原创 2011-11-27 14:56:23 · 1906 阅读 · 0 评论 -
《Linux C一站式学习》第一章 程序的基本概念
1. 程序和编程语言程序是由一系列指令(instruction)构成,指令包含:输入、输出、基本运算、测试和分支、循环。编程语言分为低级语言(机器语言和汇编语言,用计算机指令编写程序)和高级语言(C、C++、Java、Python,用语句编写程序)。表 1.1. 一个语句的三种表示编程语言表示形式C语言原创 2011-11-27 14:55:22 · 2354 阅读 · 0 评论 -
《Windows程序设计》第二章 Unicode简介
字符集简史先天即被ANSI 束缚的C程式设计语言通过对宽字元集的支援来支援Unicode。开发ASCII 的过程中,在字元长度是6 位元、7 位元还是8 位元的问题上产生了很大的争议。从可靠性的观点来看不应使用替换字元,因此ASCII 不能是6 位元编码,但由於费用的原因也排除了8 位元版本的方案(当时每位元的储存空间成本仍很昂贵)。这样,最终的字元码就有26原创 2011-11-27 14:53:50 · 1995 阅读 · 0 评论 -
《Windows程序设计》第三章 窗口和消息
总体结构所谓「Windows给程序发送消息」,是指Windows呼叫程序中的一个函数,该函数的参数描述了这个特定消息。这种位于Windows程序中的函数称为「窗口消息处理程序」。程序建立的每一个窗口都有相关的窗口消息处理程序。这个窗口消息处理程序是一个函数,既可以在程序中,也可以在动态链接库中。Windows通过呼叫窗口消息处理程序来给窗口发送消息。窗口消息处理程序根据此消息进行处理,然后原创 2011-11-27 14:52:43 · 2468 阅读 · 0 评论