﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-&lt;B&gt;&lt;font face="Arial" size="6" color="#24f814"&gt;✽✽✽七楼的阳光✽✽✽&lt;/font&gt; &lt;/B&gt;</title><link>http://www.cppblog.com/guangping/</link><description>&lt;font face="Arial" size="4" color="#FF8000"&gt;－－－宁静致远，超然世外。&lt;/font&gt; </description><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 05:36:53 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 05:36:53 GMT</pubDate><ttl>60</ttl><item><title>人生悟</title><link>http://www.cppblog.com/guangping/archive/2009/08/26/94461.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Wed, 26 Aug 2009 07:21:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2009/08/26/94461.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/94461.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2009/08/26/94461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/94461.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/94461.html</trackback:ping><description><![CDATA[话说当年，有一年轻浪子，对现实不满，愤然离去。身背一卷书，手持笔记本，游历八方，尝尽人间冷暖，见惯潮起潮落。心态复归平和，方悟天下之大，万法归宗。一切皆身外物，人生一世，能尽已性而为，实乃人生大幸。
<img src ="http://www.cppblog.com/guangping/aggbug/94461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2009-08-26 15:21 <a href="http://www.cppblog.com/guangping/archive/2009/08/26/94461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>旺角的天空---香港旧梦2</title><link>http://www.cppblog.com/guangping/archive/2009/08/24/94316.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Mon, 24 Aug 2009 14:38:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2009/08/24/94316.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/94316.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2009/08/24/94316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/94316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/94316.html</trackback:ping><description><![CDATA[ 如织的人流在方园一公里的旺角街头看起来格外拥挤，天太热，穿在身上的那件&#8220;七匹狼&#8221;衬衫贴在身上着实不爽，我一个人无聊的在街道上很茫然的走着。今天休假，实在不想回深圳了，回到深圳就要跟公司那几个很无趣的人呆在宿舍中。那帮人实在不合我的味口，这个周未不如就在港岛了。口很干，看见街边有卖冰西瓜汁的，忙忙的买一杯，居然要10元港币，也管不了那么多了，一口气灌下去。就像烈日下的祥子，咕咚咚的一顿牛饮。一下子舒服不少，心情逐渐的好起来。我沿街边的商铺一间一间的闲逛，花了八百多港币，买了两件随身穿的汗衫，又买了一双adidas运动鞋。呵呵。想想也有些可笑。到了香港成天看别人穿运动鞋，一副丝毫不怕闷脚的样子，而我一直穿凉鞋，这下我也学学那帮子鸟人，穿一穿运动鞋，时尚一下。我一个人在旺角街头绕来绕去，天真的很闷热，看见不远处有家茶馆，我赶忙闪身进去。老板热心的上前询问要什么，我一眼瞅见店中央大坛子放的硕大乌龟壳，于是点了一杯龟菱茶，细细品起来，味微苦，但饮后口舌生津，此时的我隔着玻璃看着外面的人流，颇感遐意。见老板挺热情，我跟老板聊了几句，看看时间不早了，就起身离去。依旧是毫无目的，可见那一阵子，真的是无聊在极点了。顺着街道走着走着就到了尖沙嘴。除了街道，还是街道，有些无趣，便决定回厂区住处。乘地铁一路就到了火炭。此时华灯初上，我的脚有些累，快到厂区附近时，这时有几家拍档已经开始营业了。我找了个位置坐下，点了2瓶啤酒并要了两盘炒菜，立即喝起来。一边喝着酒，一边想着心事。我想女儿了，实在太想了。我老想抱着女儿在街头闲逛呵。这么小的愿望，此时看来却是奢求。人在江湖，身不由已。想着想着，眼睛竟湿润起来，索性又要了两瓶酒，虽然香港物价贵，一瓶啤酒竟要20元港币，不过我也不多考虑了。3瓶啤酒下肚，神情开始有些恍惚。正所谓对酒当歌，人生几何，何以解忧，唯有杜康。    <img src ="http://www.cppblog.com/guangping/aggbug/94316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2009-08-24 22:38 <a href="http://www.cppblog.com/guangping/archive/2009/08/24/94316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件监理</title><link>http://www.cppblog.com/guangping/archive/2009/07/09/89664.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Thu, 09 Jul 2009 08:30:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2009/07/09/89664.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/89664.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2009/07/09/89664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/89664.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/89664.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 摘要：本文对软件开发型信息化项目的监理工作按照流程进行了设计：招标阶段、总体规划阶段、需求分析阶段、概要设计阶段、详细设计阶段、编码和测试阶段、系统试运行阶段；并介绍了每个阶段监理方应承担的工作。</span>
<p style="FONT-SIZE: 10pt">　　关键词：软件开发型 项目监理 流程</p>
<p style="FONT-SIZE: 10pt">　　Abstract: This paper designs the surveillance flows of information engineering that focused on software development: the phase of inviting public bidding、of laying out、of demand analysis、 of outline design、of detail design、of coding and testing 、of system test run , and presents the necessary work that the surveillant should do in the different phase.</p>
<p style="FONT-SIZE: 10pt">　　Key words: project of software development surveillance flow</p>
<p style="FONT-SIZE: 10pt">　　一、三种类型的信息化监理项目介绍</p>
<p style="FONT-SIZE: 10pt">　　按照信息化工程项目本身的特点，信息化工程项目监理可以划分为三类：硬件网络集成项目的监理、软件产品实施型信息化项目的监理以及软件开发型信息化项目的监理。下面分别介绍这三类监理工作的特点：</p>
<p style="FONT-SIZE: 10pt">　　硬件网络集成项目的监理：这类项目，主要包括综合布线和网络系统集成。这类监理最主要的特点是，硬件网络集成项目的评测标准是非常明确，易于执行的。比如，综合布线的监理依据有&#8220;<a onclick="javascript:tagshow(event, '%E4%B8%AD%E5%9B%BD');" href="javascript:;" target=_self>中国</a>工程建筑标准化协会标准CESC89:97.5建筑与建筑群综合布线系统工程施工和验收规范&#8221;、&#8220;中华人民共和国通信行业标准YD/T926.11997大楼通信综合布线系统&#8221;等，网络质量监理依据有&#8220;ANSIX3T9.5光纤分布式数据接口标准规范&#8221;等，这些都是直接面向结果的规范。所以，相对于软件产品实施型信息化项目的监理和软件开发型信息化项目的监理，硬件网络集成项目的监理是比较简单的。</p>
<p style="FONT-SIZE: 10pt">　　软件产品实施型信息化项目的监理：这类项目，主要是面向各厂商开发出来的产品软件，选择出合适的软件产品，并根据企业需求进行实施。相对于硬件网络集成项目的监理，这类项目涉及到对于软件应用的评测，而目前对于软件评测，国家还没有相应的标准来控制。事实上，软件实施评测也不容易形成统一的标准，这造成了此类项目监理一定的难度。</p>
<p style="FONT-SIZE: 10pt">　　软件开发型信息化项目的监理：这类项目，主要是基于一定的硬件网络设施，由承建方根据建设方需求开发出一套能够满足建设方需求的软件系统。由于软件开发工作，是知识密集程度非常高的工作，在某种程度上，也是非常个性化的。目前对于软件开发项目的各种标准，多是针对软件开发过程的控制，比如术语、文档等。因此这类项目监理也有一定难度。</p>
<p style="FONT-SIZE: 10pt">　　笔者将结合自身的软件开发型项目监理的经历，就此类信息化项目监理工作的流程研究进行初步的试探。</p>
<p style="FONT-SIZE: 10pt">　　由于建设方和监理方的关系始于双方监理合同的签订，所以本文的监理流程从监理合同签订开始。但鉴于在合同签订前监理方的前期准备工作是监理后续工作的基础，因此先描述监理方的准备工作是非常必要的。</p>
<p style="FONT-SIZE: 10pt">　　在签订监理合同之前，监理公司首先应对建设单位进行需求调研。此次需求调研的直接目的是为了编制更详细的项目建议书以获得监理合同，同时也是为招投标阶段编制招标文件做准备。此次调研主要明确如下问题：建设方在该项目上总体上要达到什么目标？细分后分别是什么目标？质量上要达到什么要求？时间方面的要求？<a onclick="javascript:tagshow(event, '%E6%8A%95%E8%B5%84');" href="javascript:;" target=_self>投资</a>预算多少？等。最后完成项目建议书和初步监理规划。</p>
<p style="FONT-SIZE: 10pt">　　下面将详细叙述每个阶段的特点及监理方在该阶段的工作。</p>
<p style="FONT-SIZE: 10pt">　　二、软件开发型项目监理基本流程</p>
<p style="FONT-SIZE: 10pt">　　1、招投标阶段</p>
<p style="FONT-SIZE: 10pt">　　在招投标阶段，监理方主要工作是根据前期调研工作，协助建设方编制招标文件，协助建设方评标及保管合同及文档。其中招标文件应包括：投标人须知、招标项目性质、技术要求、质量要求、工期要求、培训要求、验收要求、报价要求、投标人资质等级要求、投标保证金要求、投标文件编制要求、评标标准、履约担保函、合同主要条款等内容。而协助评标工作主要则从以下方面入手：</p>
<p style="FONT-SIZE: 10pt">　　⑴、技术方面</p>
<p style="FONT-SIZE: 10pt">　　对于技术方面的评比，一般有两种方法：一是比较法，二是打分法。比较法一般是从标书的技术部分中选取一些关键技术进行横向比较，谁的参数最接近标书要求，谁的技术评比的名次就越靠前。相对于比较法，打分法的精确性更高些。打分法也是从标书中选择关键技术参数，按照预定好的权值计算分值进行打分，分数高者就在技术方面具有更大优势。两种方法各有长短。打分法一般适用于需要提取的关键技术种类比较多比较复杂且具有较大的成熟度、能较清晰划分高下的情况，但在目前的评标工作中，一般都是采用比较法。</p>
<p style="FONT-SIZE: 10pt">　　在技术方面，同时还应该考虑投标单位的技术背景等信息。比如公司具有的CMM等级，是否有过类似项目的开发经验以及过去项目的客户反馈等。</p>
<p style="FONT-SIZE: 10pt">　　⑵、价格方面</p>
<p style="FONT-SIZE: 10pt">　　在价格方面，监理方应协助招标方对评标价进行评比。在核算时应注意如下因素：</p>
<p style="FONT-SIZE: 10pt">　　①、总报价是否等于各分项报价之和。如果总报价不等于各分项报价之和，则以各分项报价之和为准，价差按误差处理。</p>
<p style="FONT-SIZE: 10pt">　　②、货币转换。如果投标价所使用的货币不一样，则需根据开标当日中国国家外汇管理局公布的各种货币对美元汇率的卖出价，将非美元报价折算成美元报价后再进行比较。</p>
<p style="FONT-SIZE: 10pt">　　③、报价缺项的处理。对照投标文件的要求核对每一项报价，如果发现有缺项报价，按规定必须先发函澄清，如果属实则将这一标中所报该项的平均报价补充投标商缺项报价计算评标价格，并且注明该项补遗的相关指标在招标文件中的序号及理由。如果缺项的总金额超过开标价格的5%时，则可视为重大偏差。</p>
<p style="FONT-SIZE: 10pt">　　④、超范围投标项目的处理。投标商在投标文件中超过投标文件规定范围投报的项目，原则上不能作为增减因素修改评标价格，也不可以发函澄清其报价。只有当超范围投标项目在报价表中有单独列名报价时，经批准可以从评标价格中扣除，并且在表下注明该项报价在投标文件中的编号以及理由。</p>
<p style="FONT-SIZE: 10pt">　　经过调整补充所得到的报价则称为评标价，对评标价进行评比和排序即得到价格方面的评测结果。</p>
<p style="FONT-SIZE: 10pt">　　⑶、其它方面</p>
<p style="FONT-SIZE: 10pt">　　任何产品的生产，都着重对质量、成本和交货期三方面的控制。对于软件开发项目，除了技术因素和价格因素，交货期也是一个重要的指标。所以投标书所报的交货期也需重点考虑。与此同时，技术规范中所要求的有关服务费用，投标人的信誉，售后服务等因素也需要考虑到。</p>
<p style="FONT-SIZE: 10pt">　　2、总体规划阶段</p>
<p style="FONT-SIZE: 10pt">　　在招投标阶段确定中标人，甲乙双方签订合同之后，整个项目就形成了建设方、承建方和监理方的三方并存协作的一个团体，因此合理统一的规划就是项目成功的基础。总体规划阶段的主要任务，就是在承建方制定出项目规划后，对其项目规划审查，并根据承建方的项目规划，修订前期制定的监理项目规划。</p>
<p style="FONT-SIZE: 10pt">　　监理规划的性质，是监理方对整个项目工作的初步设计，是具体的监理活动的基础。监理规划一般由监理方在该项目的总监理工程师制定。其基本内容应包括：</p>
<p style="FONT-SIZE: 10pt">　　⑴、工程概况。包括工程名称、建设地址，项目组成及规模，预计总投资额，预计项目工期，工程质量等级，设计、开发单位名称，工程特点等。</p>
<p style="FONT-SIZE: 10pt">　　⑵、监理范围和目标。监理范围一般包括在工程各阶段的质量控制、进度控制和投资控制，以及其它委托服务。监理目标以三大控制为目标。</p>
<p style="FONT-SIZE: 10pt">　　⑶、主要监理措施。</p>
<p style="FONT-SIZE: 10pt">　　⑷、监理组织机构。</p>
<p style="FONT-SIZE: 10pt">　　⑸、项目监理工作制度。如监理方内部的工作会议制度、监理日志制度、监理周报和月报制度，监理方与另两方的定期沟通制度等。</p>
<p style="FONT-SIZE: 10pt">　　这个阶段结束时，监理方应提交：监理规划。</p>
<p style="FONT-SIZE: 10pt">　　3、需求分析阶段</p>
<p style="FONT-SIZE: 10pt">　　需求分析是项目建设的基石，监理方在需求分析阶段应以尊重承建方的项目管理和项目分析能力为前提，在具体的任务开展上不深入、不干扰承建方的自主权。同时，监理方要充分发挥好项目监督及沟通建设方和承建方之间的桥梁作用。</p>
<p style="FONT-SIZE: 10pt">　　需求分析的工作方法，通常有三个阶段。</p>
<p style="FONT-SIZE: 10pt">　　第一阶段：访谈阶段。这一阶段是和具体用户方的领导层、业务层人员的访谈式沟通，目的是从宏观了解用户需求方向和趋势，了解现有组织构架、业务流程、软硬件环境及使用情况。实现手段通常是事先将调查问卷发放到待调研部门，然后在约定时间围绕问卷进行交流访谈。</p>
<p style="FONT-SIZE: 10pt">　　第二阶段：深入阶段。这一阶段的工作是建立在访谈阶段工作完成，承建方已经了解了用户的组织构架、业务流程、软硬件环境及使用情况等基本现状的基础之上。承建方根据以往项目经验以及业务专家的经验，和建设方共同探讨业务模型的合理性、准确性和发展方向等问题，得到相对先进的业务模型。</p>
<p style="FONT-SIZE: 10pt">　　第三阶段：确认阶段。在完成上两阶段的工作之后，就需要对具体的流程细化，对数据进行确认了。根据前两个阶段的工作，承建方应草拟出一份需求分析报告，并提供原型演示系统，和建设方进行进一步的讨论，最终确定一份需求分析报告。</p>
<p style="FONT-SIZE: 10pt">　　需要指出的是，在系统建设的过程中，特别在采用迭代法的开发模式时，需求分析的工作需一直进行下去，而在后期的需求改进中，工作则基本集中在后两个阶段中。</p>
<p style="FONT-SIZE: 10pt">　　监理方在这三个阶段的工作，按照内容可以分为两部分：监督和沟通。监督工作包括对需求分析阶段的各种文档的保管监督，对承建方的访谈活动的监督，对需求分析报告、原型演示系统的确认等；沟通工作则表现在当建设方和承建方由于知识背景不同而在访谈过程中沟通不顺畅的时候，监理方应利用自身优势使得双方顺利理解对方。</p>
<p style="FONT-SIZE: 10pt">　　需求分析阶段，监理方可参考的标准有：GB938588计算机软件需求说明编写指南。</p>
<p style="FONT-SIZE: 10pt">　　这个阶段监理方应提交：在需求分析进行前提交需求分析阶段监理细则、监理日志、在需求分析结束后提交需求分析阶段总结报告。</p>
<p style="FONT-SIZE: 10pt">　　4、概要设计阶段</p>
<p style="FONT-SIZE: 10pt">　　概要设计，即将软件需求转化为数据结构和软件的系统结构，一般包括数据设计和系统结构设计。其中数据设计侧重于数据结构的定义，系统结构设计定义软件系统各主要成份之间的关系。</p>
<p style="FONT-SIZE: 10pt">　　在承建方进行概要设计的过程中，监理方需要监督以下方面：</p>
<p style="FONT-SIZE: 10pt">　　⑴、制定规范</p>
<p style="FONT-SIZE: 10pt">　　在进入软件开发阶段之初，首先应为软件开发组制定在设计时应该共同遵守的标准，以便协调组内各成员的工作。包括：</p>
<p style="FONT-SIZE: 10pt">　　阅读和理解软件需求说明书，确认用户要求能否实现，明确实现的条件，从而确定设计的目标，以及它们的优先顺序；</p>
<p style="FONT-SIZE: 10pt">　　根据目标确定最合适的设计方法；</p>
<p style="FONT-SIZE: 10pt">　　规定设计文档的编制标准；</p>
<p style="FONT-SIZE: 10pt">　　规定编码的信息形式，与硬件，操作系统的接口规约，命名规则。</p>
<p style="FONT-SIZE: 10pt">　　⑵、软件系统结构的总体设计</p>
<p style="FONT-SIZE: 10pt">　　根据需求分析，基于功能层次结构建立系统，其中包括采用某种设计方法，将系统按功能划分成模块的层次结构、确定每个模块的功能、建立与已确定的软件需求的对应关系、确定模块间的调用关系、确定模块间的接口、评估模块划分的质量。</p>
<p style="FONT-SIZE: 10pt">　　⑶、处理方式设计</p>
<p style="FONT-SIZE: 10pt">　　处理方式设计要确定为实现系统的功能需求所必需的算法，评估算法的性能；确定为满足系统的性能需求所必需的算法和模块间的控制方式；确定外部信号的接收发送形式。</p>
<p style="FONT-SIZE: 10pt">　　⑷、数据结构设计</p>
<p style="FONT-SIZE: 10pt">　　根据需求分析报告进行数据库设计。数据库设计包括确定软件涉及的文件系统的结构以及数据库的模式、子模式，进行数据完整性和安全性的设计；确定输入，输出文件的详细的数据结构；结合算法设计，确定算法所必需的逻辑数据结构及其操作；确定对逻辑数据结构所必需的那些操作的程序模块(软件包)；限制和确定各个数据设计决策的影响范围；若需要与操作系统或调度程序接口所必须的控制表等数据时，确定其详细的数据结构和使用规则；数据的保护性设计；数据的一致性设计；冗余性设计等。</p>
<p style="FONT-SIZE: 10pt">　　⑸、可靠性设计</p>
<p style="FONT-SIZE: 10pt">　　可靠性设计也叫做质量设计。在运行过程中，为了适应环境的变化和用户新的要求，需经常对软件进行改造和修正。在软件开发的一开始就要确定软件可靠性和其它质量指标，考虑相应措施，以使得软件易于修改和易于维护。</p>
<p style="FONT-SIZE: 10pt">　　⑹、概要设计阶段的文档</p>
<p style="FONT-SIZE: 10pt">　　概要设计阶段完成时应编写以下文档：概要设计说明书、数据库设计说明书、用户手册、制定初步的测试计划。</p>
<p style="FONT-SIZE: 10pt">　　针对上述工作，监理方应按如下标准评定承建方的概要设计：</p>
<p style="FONT-SIZE: 10pt">　　⑴、可追溯性：确认该设计是否覆盖了所有已确定的软件需求，软件每一成份是否可追溯到某一项需求；</p>
<p style="FONT-SIZE: 10pt">　　⑵、接口：确认该软件的内部接口与外部接口是否已经明确定义，模块是否满足高内聚和低耦合的要求，模块作用范围是否在其控制范围之内；</p>
<p style="FONT-SIZE: 10pt">　　⑶、风险：确认该设计在现有技术条件下和预算范围内是否能按时实现；</p>
<p style="FONT-SIZE: 10pt">　　⑷、实用性：确认该设计对于需求的解决方案是否实用；</p>
<p style="FONT-SIZE: 10pt">　　⑸、技术清晰度：确认该设计是否以一种易于翻译成代码的形式表达；</p>
<p style="FONT-SIZE: 10pt">　　⑹、可维护性：确认该设计是否考虑了方便未来的维护；</p>
<p style="FONT-SIZE: 10pt">　　⑺、质量：确认该设计是否表现出良好的质量特征；</p>
<p style="FONT-SIZE: 10pt">　　⑻、各种选择方案：看是否考虑过其它方案，比较各种选择方案的标准是什么；</p>
<p style="FONT-SIZE: 10pt">　　⑼、限制：评估对该软件的限制是否现实，是否与需求一致；</p>
<p style="FONT-SIZE: 10pt">　　⑽、其它具体问题：对于文档、可测试性、设计过程等进行评估。</p>
<p style="FONT-SIZE: 10pt">　　这个阶段监理方应提交：在概要设计进行前提交总体设计阶段监理细则、监理周记、在概要设计完成后提交概要设计监理报告。</p>
<p style="FONT-SIZE: 10pt">　　5、详细设计阶段</p>
<p style="FONT-SIZE: 10pt">　　详细设计阶段的直接目标是编写详细设计说明书，为此，承建方应做如下工作：</p>
<p style="FONT-SIZE: 10pt">　　⑴、确定每个模块的算法，用工具表达算法的过程，写出模块的详细过程性描述；</p>
<p style="FONT-SIZE: 10pt">　　⑵、确定每一模块的数据结构；</p>
<p style="FONT-SIZE: 10pt">　　⑶、确定模块接口细节。</p>
<p style="FONT-SIZE: 10pt">　　监理方在这个阶段主要是在进度上进行控制，主要手段是定期与承建方沟通，检查文档。</p>
<p style="FONT-SIZE: 10pt">　　这个阶段监理方应提交：在详细设计进行前提交详细设计阶段监理细则、监理周记、在详细设计完成后提交详细设计说明书的确认报告。</p>
<p style="FONT-SIZE: 10pt">　　6、编码及测试阶段</p>
<p style="FONT-SIZE: 10pt">　　编码是将详细设计阶段的设计思想用某种计算机语言实现的过程。监理方应从结构化程序设计原则来进行编码工作的监理：</p>
<p style="FONT-SIZE: 10pt">　　⑴、使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑；</p>
<p style="FONT-SIZE: 10pt">　　⑵、选用的控制结构只准许有一个入口和一个出口；</p>
<p style="FONT-SIZE: 10pt">　　⑶、程序语句组成容易识别的块，每块只有一个入口和一个出口；</p>
<p style="FONT-SIZE: 10pt">　　⑷、复杂结构应该用基本控制结构进行组合嵌套来实现；</p>
<p style="FONT-SIZE: 10pt">　　⑸、语言中没有的控制结构，可用一段等价的程序段模拟，但要求该程序段在整个系统中应前后一致；</p>
<p style="FONT-SIZE: 10pt">　　通常测试是伴随着编码而同时进行的。广义上软件测试并非只在这个阶段才有，而是贯穿软件需求分析、概要设计、详细设计等阶段的。本处的测试，则指代码测试。在测试阶段，监理方应依据测试原则对承建方的测试进行监督：</p>
<p style="FONT-SIZE: 10pt">　　⑴、应尽早的和不断的进行软件测试；</p>
<p style="FONT-SIZE: 10pt">　　⑵、测试用例应由测试输入数据和对应的预期输出结果这两部分组成；</p>
<p style="FONT-SIZE: 10pt">　　⑶、程序员应避免检查自己的程序；</p>
<p style="FONT-SIZE: 10pt">　　⑷、在设计测试用例时，应包括合理的输入条件和不合理的输入条件；</p>
<p style="FONT-SIZE: 10pt">　　⑸、充分注意测试中的群集现象，即一般测试后程序中残存的错误数目与该程序中已发现的错误数目成正比；</p>
<p style="FONT-SIZE: 10pt">　　⑹、严格执行测试计划，排除测试的随意性；</p>
<p style="FONT-SIZE: 10pt">　　⑺、应当对每一个测试结果做全面检查。</p>
<p style="FONT-SIZE: 10pt">　　⑻、妥善保存测试计划，测试用例，出错统计和最终分析报告，为维护提供方便。</p>
<p style="FONT-SIZE: 10pt">　　在编码及测试阶段监理方可参考的标准有：GB938688计算机软件测试文件编制规范、GB/T1250490计算机软件质量标准保证计划规范、GB/T1250590计算机软件配置管理计划规范、GB/T1553295计算机软件单元测试等。</p>
<p style="FONT-SIZE: 10pt">　　7、系统试运行阶段</p>
<p style="FONT-SIZE: 10pt">　　由于信息化软件一般都是比较大型的软件，因此在完成了系统测试后还需要经过一段时间的试运行。系统试运行实际是测试的延续，检查系统的稳定性、适用性等。监理方在这个阶段的主要工作有：</p>
<p style="FONT-SIZE: 10pt">　　⑴、审核竣工文档资料的完整性、可读性及其与工程实际的一致性；</p>
<p style="FONT-SIZE: 10pt">　　⑵、审核操作系统、应用系统等软件配置与设计方案的符合性；</p>
<p style="FONT-SIZE: 10pt">　　⑶、检测验证系统功能性能与合同的符合性；</p>
<p style="FONT-SIZE: 10pt">　　⑷、检查人员培训计划落实情况；</p>
<p style="FONT-SIZE: 10pt">　　⑸、出具验收报告；</p>
<p style="FONT-SIZE: 10pt">　　⑹、帮助用户制定系统运行管理规章制度；</p>
<p style="FONT-SIZE: 10pt">　　⑺、在保修期内定期或不定期对项目进行质量检查、督促承建方按合同要求进行维护。</p>
<p style="FONT-SIZE: 10pt">　　小结</p>
<p style="FONT-SIZE: 10pt">　　从监理合同签订开始到最后系统试运行结束，监理方工作在职能上可以归结为两点：沟通与监督。沟通的目标是建设方与承建方信息对等，沟通的手段是定期或不定期召开工作会议；监督的目标是在质量、进度和投资上进行控制，监督的手段是合同管理和文档管理。</p>
<p style="FONT-SIZE: 10pt">　　参考文献</p>
<p style="FONT-SIZE: 10pt">　　1.葛乃康，罗四维信息工程建设监理电子工业出版社2002年<br>　　2.张海藩软件工程导论清华大学出版社1998年<br>　　3.黄学战项目需求阶段的监理角色和方法论中国计算机报2003年第三期</p>
<br>
<img src ="http://www.cppblog.com/guangping/aggbug/89664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2009-07-09 16:30 <a href="http://www.cppblog.com/guangping/archive/2009/07/09/89664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>失落的情怀---香港旧梦1</title><link>http://www.cppblog.com/guangping/archive/2009/06/29/88731.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Sun, 28 Jun 2009 16:27:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2009/06/29/88731.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/88731.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2009/06/29/88731.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/88731.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/88731.html</trackback:ping><description><![CDATA[很奇怪，这两天工作繁忙的很，几乎每晚都是半夜时分才入睡，满脑子的代码，接口问题
。即便如此，仍然作了梦，梦中依稀又回到香港（我曾在香港工作1年），依旧坐在维港之
畔，看着对岸的斓珊灯火，抽着无聊的Salem 烟，耳边听着少男少女的嘻闹声。猛然于床
头惊醒，恍然间又忆起旺角的那次问路经历，匆匆忙忙的旺角街头遍寻不见地铁站，无奈
的我向一位香港女孩询问，那位女孩很漂亮，当时我甚至不完全为了问路，呵呵。没成想
，那个女孩非常热情的用她那难听懂的港语告诉我，并领我前往。我们一路聊着，我很开
心有位MM陪同，虽然我们交流语言很困难，她不很听懂国语，我也不很听懂港语 ，但并没
有影响我们的谈话。直到地铁站，她才停下来指给我，仿佛在等待着什么。那一瞬间，我
有些慌乱，仿佛又像17岁时的青涩少年，有些不知所措。终于我想起了自已身上的名片，
平静而优雅的递给她。她从包里摸出一支笔和一张纸，把她的名字，手机号写好，递给我
。她的脸红了，我知道，自已应该说些什么，但终究没有说出口，因为我第二天就要离港
了，我至今想起来仍很痛恨为什么偏偏第二天就要离港。她笑了笑，把名片放进包里，转
身离去，我愣愣的站在那里望着她的背影，突然她回转身，给了我一个灿烂的笑脸。那一
刻，我感觉阳光好明媚，真的说不出的那种感觉，就是少年时代的那种感觉，好美妙的那
种感觉。第二天，我必须要离港了，我的签证到期了。坐在开往罗湖的列车上，我的思绪
再一次想起那个阳光女孩，忍不住拿出手机（幸好开通了香港漫游）拔通了她的号码。她
很惊讶。我在电话这端告诉她，我很感谢她，希望有机会她能过深圳来玩。她很快乐的答
应了，我听的出来，她在笑。于是我也笑，我告诉她，等她来深圳时，我会给她一份浪漫
的惊喜。她爽快的应允了。挂了电话，我有些不安了，倘若她真的来深圳了，我如何摆平
我老婆的猜疑。呵呵，越想越不安。后来也许是命中无缘，回到深圳的一周后，我就被公司
派到福建的工厂去担任分管技术的副厂长，不得不再一次离开深圳。之后半个月，她真的给我来了
个电话，我在电话中告诉她，我人已在福建。电话那一端的她沉默的一会，我也沉默了片刻。我知道她很失望，我不晓得说什么才能解释清楚，我知道我已经伤害了
一个人，她一定认为我耍弄了她。我没有理由去招惹这种事，但我却做了。平白无故的让
一个好女孩感到受骗。我后来非常后悔，真的，我不喜欢欠一个人的，但我毕竟欠了，并
且是无法偿还的欠了。这件事情，这些年我一直深埋心底，偶尔夜深人静时就会忆起这桩
事，只能在遥远的地方祝福那个女孩一生平安幸福。  <img src ="http://www.cppblog.com/guangping/aggbug/88731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2009-06-29 00:27 <a href="http://www.cppblog.com/guangping/archive/2009/06/29/88731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 下串口编程入门</title><link>http://www.cppblog.com/guangping/archive/2009/06/28/66914.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Sun, 28 Jun 2009 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2009/06/28/66914.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/66914.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2009/06/28/66914.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/66914.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/66914.html</trackback:ping><description><![CDATA[
		<div class="title">
				<h1>Linux 下串口编程入门</h1>
		</div>
		<b>计算机串口的引脚定义<br /><br /></b>
		<table 80%="" border="1" cellpadding="0" cellspacing="0">
				<tbody>
						<tr>
								<td 10%="" align="center">序号</td>
								<td 30%="" align="center">信号名称</td>
								<td 10%="" align="center">符号</td>
								<td 10%="" align="center">流向</td>
								<td 40%="" align="center">功能</td>
						</tr>
						<tr>
								<td align="center">2</td>
								<td align="center">发送数据</td>
								<td align="center">TXD</td>
								<td align="center">DTE→DCE</td>
								<td>DTE发送串行数据</td>
						</tr>
						<tr>
								<td align="center">3</td>
								<td align="center">接收数据</td>
								<td align="center">RXD</td>
								<td align="center">DTE←DCE</td>
								<td>DTE 接收串行数据</td>
						</tr>
						<tr>
								<td align="center">4</td>
								<td align="center">请求发送</td>
								<td align="center">RTS</td>
								<td align="center">DTE→DCE</td>
								<td>DTE 请求 DCE 将线路切换到发送方式</td>
						</tr>
						<tr>
								<td align="center">5</td>
								<td align="center">允许发送</td>
								<td align="center">CTS</td>
								<td align="center">DTE←DCE</td>
								<td>DCE 告诉 DTE 线路已接通可以发送数据</td>
						</tr>
						<tr>
								<td align="center">6</td>
								<td align="center">数据设备准备好</td>
								<td align="center">DSR</td>
								<td align="center">DTE←DCE</td>
								<td>DCE 准备好</td>
						</tr>
						<tr>
								<td align="center">7</td>
								<td align="center">信号地</td>
								<td align="center">　</td>
								<td align="center">　</td>
								<td>　　　信号公共地</td>
						</tr>
						<tr>
								<td align="center">8</td>
								<td align="center">载波检测</td>
								<td align="center">DCD</td>
								<td align="center">DTE←DCE</td>
								<td>表示 DCE 接收到远程载波</td>
						</tr>
						<tr>
								<td align="center">20</td>
								<td align="center">数据终端准备好</td>
								<td align="center">DTR</td>
								<td align="center">DTE→DCE</td>
								<td>DTE 准备好</td>
						</tr>
						<tr>
								<td align="center">22</td>
								<td align="center">振铃指示</td>
								<td align="center">RI</td>
								<td align="center">DTE←DCE</td>
								<td>表示 DCE 与线路接通，出现振铃</td>
						</tr>
				</tbody>
		</table>
		<a name="N1013B">
				<span class="atitle">串口操作<br /></span>
		</a>
		<p>串口操作需要的头文件
</p>
		<pre class="displaycode">#include     <stdio.h>      /*标准输入输出定义*/<br />#include     <stdlib.h>     /*标准函数库定义*/<br />#include     <unistd.h>     /*Unix 标准函数定义*/<br />#include     <br />#include     <br />#include     <fcntl.h>      /*文件控制定义*/<br />#include     <termios.h>    /*PPSIX 终端控制定义*/<br />#include     <errno.h>      /*错误号定义*/<br /></errno.h></termios.h></fcntl.h></unistd.h></stdlib.h></stdio.h></pre>
		<p>
				<a name="N10148">
						<span class="atitle">打开串口</span>
				</a>
		</p>
		<p>
在 Linux 下串口文件是位于 /dev 下的
</p>
		<p>串口一 为 /dev/ttyS0
</p>
		<p>串口二 为 /dev/ttyS1
</p>
		<p>打开串口是通过使用标准的文件打开函数操作：
</p>
       
      int fd;
/*以读写方式打开串口*/
<br />fd = open( "/dev/ttyS0", O_RDWR);//| O_NOCTTY | O_NDELAY<br />if (-1 == fd)<br />{ 
<br />    /* 不能打开串口一*/ 
<br />    perror(" 提示错误！");
<br />}<br /><p><a name="N1015E"><span class="atitle">设置串口</span></a></p><p>最基本的设置串口包括波特率设置，效验位和停止位设置。</p><p>串口的设置主要是设置 struct termios 结构体的各成员值。
</p><pre class="displaycode">struct termio<br />{	unsigned short  c_iflag;	/* 输入模式标志 */	<br />	unsigned short  c_oflag;		/* 输出模式标志 */	<br />	unsigned short  c_cflag;		/* 控制模式标志*/	<br />	unsigned short  c_lflag;		/* local mode flags */	<br />	unsigned char  c_line;		    /* line discipline */	<br />	unsigned char  c_cc[NCC];    /* control characters */<br />};<br /></pre><p>设置这个结构体很复杂，我这里就只说说常见的一些设置：
</p><p>波特率设置</p><p>下面是修改波特率的代码：</p><pre class="displaycode">struct  termios Opt;<br />tcgetattr(fd, &amp;Opt);<br />cfsetispeed(&amp;Opt,B19200);     /*设置为19200Bps*/<br />cfsetospeed(&amp;Opt,B19200);<br />tcsetattr(fd,TCANOW,&amp;Opt);<br />设置波特率的例子函数：<br />/**<br />*@brief  设置串口通信速率<br />*@param  fd     类型 int  打开串口的文件句柄<br />*@param  speed  类型 int  串口速度<br />*@return  void<br />*/<br />int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,<br />					B38400, B19200, B9600, B4800, B2400, B1200, B300, };<br /><!-- code sample is too wide -->int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300, 38400,  <br />					19200,  9600, 4800, 2400, 1200,  300, };<br />void set_speed(int fd, int speed){<br />	int   i; <br />	int   status; <br />	struct termios   Opt;<br />	tcgetattr(fd, &amp;Opt); <br />	for ( i= 0;  i &lt; sizeof(speed_arr) / sizeof(int);  i++) { <br />		if  (speed == name_arr[i]) {     <br />			tcflush(fd, TCIOFLUSH);     <br />			cfsetispeed(&amp;Opt, speed_arr[i]);  <br />			cfsetospeed(&amp;Opt, speed_arr[i]);   <br />			status = tcsetattr(fd1, TCSANOW, &amp;Opt);  <br />			if  (status != 0) {        <br />				perror("tcsetattr fd1");  <br />				return;     <br />			}    <br />			tcflush(fd,TCIOFLUSH);   <br />		}  <br />	}<br />}<br />效验位和停止位的设置：<br /></pre><table 100%="" border="1" cellpadding="0" cellspacing="0"><tbody><tr><td 20%="" align="center">无效验</td><td 20%="" align="center">8位</td><td 60%="">
Option.c_cflag &amp;= ~PARENB;
            <br />
Option.c_cflag &amp;= ~CSTOPB;
            <br />
Option.c_cflag &amp;= ~CSIZE;
            <br />
Option.c_cflag |= ~CS8;
          </td></tr><tr><td 20%="" align="center">奇效验(Odd)</td><td 20%="" align="center">7位</td><td 60%="">
Option.c_cflag |= ~PARENB;
            <br />
Option.c_cflag &amp;= ~PARODD;
            <br />
Option.c_cflag &amp;= ~CSTOPB;
            <br />
Option.c_cflag &amp;= ~CSIZE;
            <br />
Option.c_cflag |= ~CS7;
          </td></tr><tr><td 20%="" align="center">偶效验(Even)</td><td 20%="" align="center">7位</td><td 60%="">
Option.c_cflag &amp;= ~PARENB;
            <br />
Option.c_cflag |= ~PARODD;
            <br />
Option.c_cflag &amp;= ~CSTOPB;
            <br />
Option.c_cflag &amp;= ~CSIZE;
            <br />
Option.c_cflag |= ~CS7;
          </td></tr><tr><td 20%="" align="center">Space效验</td><td 20%="" align="center">7位</td><td 60%="">
Option.c_cflag &amp;= ~PARENB;
            <br />
Option.c_cflag &amp;= ~CSTOPB;
            <br />
Option.c_cflag &amp;= &amp;~CSIZE;
            <br />
Option.c_cflag |= CS8;
          </td></tr></tbody></table><pre class="displaycode">设置效验的函数：<br />/**<br />*@brief   设置串口数据位，停止位和效验位<br />*@param  fd     类型  int  打开的串口文件句柄<br />*@param  databits 类型  int 数据位   取值 为 7 或者8<br />*@param  stopbits 类型  int 停止位   取值为 1 或者2<br />*@param  parity  类型  int  效验类型 取值为N,E,O,,S<br />*/<br />int set_Parity(int fd,int databits,int stopbits,int parity)<br />{ <br />	struct termios options; <br />	if  ( tcgetattr( fd,&amp;options)  !=  0) { <br />		perror("SetupSerial 1");     <br />		return(FALSE);  <br />	}<br />	options.c_cflag &amp;= ~CSIZE; <br />	switch (databits) /*设置数据位数*/<br />	{   <br />	case 7:		<br />		options.c_cflag |= CS7; <br />		break;<br />	case 8:     <br />		options.c_cflag |= CS8;<br />		break;   <br />	default:    <br />		fprintf(stderr,"Unsupported data size\n"); return (FALSE);  <br />	}<br />switch (parity) <br />{   <br />	case 'n':<br />	case 'N':    <br />		options.c_cflag &amp;= ~PARENB;   /* Clear parity enable */<br />		options.c_iflag &amp;= ~INPCK;     /* Enable parity checking */ <br />		break;  <br />	case 'o':   <br />	case 'O':     <br />		options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/  <br />		options.c_iflag |= INPCK;             /* Disnable parity checking */ <br />		break;  <br />	case 'e':  <br />	case 'E':   <br />		options.c_cflag |= PARENB;     /* Enable parity */    <br />		options.c_cflag &amp;= ~PARODD;   /* 转换为偶效验*/     <br />		options.c_iflag |= INPCK;       /* Disnable parity checking */<br />		break;<br />	case 'S': <br />	case 's':  /*as no parity*/   <br />	    options.c_cflag &amp;= ~PARENB;<br />		options.c_cflag &amp;= ~CSTOPB;break;  <br />	default:   <br />		fprintf(stderr,"Unsupported parity\n");    <br />		return (FALSE);  <br />	}  <br />/* 设置停止位*/  <br />switch (stopbits)<br />{   <br />	case 1:    <br />		options.c_cflag &amp;= ~CSTOPB;  <br />		break;  <br />	case 2:    <br />		options.c_cflag |= CSTOPB;  <br />	   break;<br />	default:    <br />		 fprintf(stderr,"Unsupported stop bits\n");  <br />		 return (FALSE); <br />} <br />/* Set input parity option */ <br />if (parity != 'n')   <br />	options.c_iflag |= INPCK; <br />tcflush(fd,TCIFLUSH);<br />options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/   <br />options.c_cc[VMIN] = 0; /* Update the options and do it NOW */<br />if (tcsetattr(fd,TCSANOW,&amp;options) != 0)   <br />{ <br />	perror("SetupSerial 3");   <br />	return (FALSE);  <br />} <br />return (TRUE);  <br />}<br /></pre><p><b>需要注意的是:</b></p><p>如果不是开发终端之类的，只是串口传输数据，而不需要串口来处理，那么使用原始模式(Raw Mode)方式来通讯，设置方式如下： <br /></p><pre class="displaycode">options.c_lflag  &amp;= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/<br />options.c_oflag  &amp;= ~OPOST;   /*Output*/<br /></pre><p><a name="N10200"><span class="atitle">读写串口</span></a></p><p>
设置好串口之后，读写串口就很容易了，把串口当作文件读写就是。
</p>
      发送数据<br /><pre class="displaycode">char  buffer[1024];int    Length;int    nByte;nByte = write(fd, buffer ,Length)<br /></pre>读取串口数据
          <p>使用文件操作read函数读取，如果设置为原始模式(Raw Mode)传输数据，那么read函数返回的字符数是实际串口收到的字符数。
</p><p>可以使用操作文件的函数来实现异步读取，如fcntl，或者select等来操作。 <br /></p><pre class="displaycode">char  buff[1024];int    Len;int  readByte = read(fd,buff,Len);<br /></pre><p><a name="N10220"><span class="atitle">关闭串口</span></a></p><p>
关闭串口就是关闭文件。 <br /></p><pre class="displaycode">close(fd);</pre><img src ="http://www.cppblog.com/guangping/aggbug/66914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2009-06-28 23:16 <a href="http://www.cppblog.com/guangping/archive/2009/06/28/66914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI命令一览表</title><link>http://www.cppblog.com/guangping/archive/2008/08/21/59516.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Thu, 21 Aug 2008 05:08:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2008/08/21/59516.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/59516.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2008/08/21/59516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/59516.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/59516.html</trackback:ping><description><![CDATA[
		<strong>
				<font color="#ff0000" size="5">VI命令一览表：</font>
		</strong>
		<span>
				<p>
						<strong>
						</strong>
						<br />
						<span style="FONT-WEIGHT: bold">进入vi的命令</span>
						<br />
						<font color="#0000ff">
								<font color="#000000">vi filename :打开或新建文件，并将光标置于第一行首</font>
								<br />
						</font>vi <font color="#ff6600">+n</font> filename ：打开文件，并将光标置于<font color="#ff6600">第n行首</font><br />vi <font color="#ff6600">+</font> filename ：打开文件，并将光标置于<font color="#ff6600">最后一行首</font><br />vi <font color="#ff6600">+/pattern</font> filename：打开文件，并将光标置于第一个与<font color="#ff6600">pattern匹配的串</font>处 <br />vi <font color="#ff6600">-r</font> filename ：在上次正用vi编辑时发生系统崩溃，<font color="#ff6600">恢复</font>filename <br />vi filename....filename ：打开多个文件，依次进行编辑 <br /><br /><span style="FONT-WEIGHT: bold">移动光标类命令</span><br />h 或 Backspace：：   光标左移一个字符 <br />l  或 space：：           光标右移一个字符 <br />k 或 Ctrl+p：              光标上移一行 <br />j 或  Enter 或 Ctrl+n ：光标下移一行 </p>
				<p>
						<br />w ：                   光标右移一个字至字首 </p>
				<p>W ：光标右移一个字至字首，忽略标点符号<br />b 或 B ：                    光标左移一个字至字首 <br />e 或 E ：                    光标右移一个字至字尾 </p>
				<p>
						<br />) ：光标移至句尾 <br />( ：光标移至句首 <br />}：光标移至段落开头 <br />{：光标移至段落结尾 </p>
				<p>
						<br />nG：光标移至第n行首 <br />n+：光标下移n行 <br />n-：光标上移n行 <br />n$：光标移至第n行尾 <br />H ：光标移至屏幕顶行 <br />M ：光标移至屏幕中间行 <br />L ：光标移至屏幕最后行 <br />0：（注意是数字零）光标移至当前行首 <br />$：光标移至当前行尾 <br /><br /><span style="FONT-WEIGHT: bold">屏幕翻滚类命令</span><br />Ctrl+u： 向文件首翻半屏 <br />Ctrl+d： 向文件尾翻半屏 <br />Ctrl+f：   向文件尾翻一屏 <br />Ctrl＋b；向文件首翻一屏 <br />nz：        将第n行滚至屏幕顶部，不指定n时将当前行滚至屏幕顶部。 <br /><br /><span style="FONT-WEIGHT: bold">插入文本类命令</span><br />i ：在光标前 <br />I ：在当前行首 <br />a：光标后 <br />A：在当前行尾 <br />o：在当前行之下新开一行 <br />O：在当前行之上新开一行 <br />r：替换当前字符 <br />R：替换当前字符及其后的字符，直至按ESC键 <br />s：从当前光标位置处开始，以输入的文本替代指定数目的字符 <br />S：删除指定数目的行，并以所输入文本代替之 <br />ncw或nCW：修改指定数目的字 <br />nCC：修改指定数目的行 <br /><br /><span style="FONT-WEIGHT: bold">删除命令</span><br />ndw或ndW：删除光标处开始及其后的n-1个字 <br />do：删至行首 <br />d$：删至行尾 <br />ndd：删除当前行及其后n-1行 <br />x或X：删除一个字符，x删除光标后的，而X删除光标前的 <br />Ctrl+u：删除输入方式下所输入的文本 <br /><br /><span style="FONT-WEIGHT: bold">搜索及替换命令</span><br />/pattern：从光标开始处向文件尾搜索pattern <br />?pattern：从光标开始处向文件首搜索pattern <br />n：在同一方向重复上一次搜索命令 <br />N：在反方向上重复上一次搜索命令 <br />：s/p1/p2/g：将当前行中所有p1均用p2替代 <br />：n1,n2s/p1/p2/g：将第n1至n2行中所有p1均用p2替代 <br />：g/p1/s//p2/g：将文件中所有p1均用p2替换 <br /><br /><span style="FONT-WEIGHT: bold">选项设置</span><br />all：列出所有选项设置情况 <br />term：设置终端类型 <br />ignorance：在搜索中忽略大小写 <br />list：显示制表位(Ctrl+I)和行尾标志（$) <br />number：显示行号 <br />report：显示由面向行的命令修改过的数目 <br />terse：显示简短的警告信息 <br />warn：在转到别的文件时若没保存当前文件则显示NO write信息 <br />nomagic：允许在搜索模式中，使用前面不带“\”的特殊字符 <br />nowrapscan：禁止vi在搜索到达文件两端时，又从另一端开始 <br />mesg：允许vi显示其他用户用write写到自己终端上的信息 <br /><br /><span style="FONT-WEIGHT: bold">末行方式命令</span><br />：n1,n2 co n3：将n1行到n2行之间的内容拷贝到第n3行下 <br />：n1,n2 m n3：将n1行到n2行之间的内容移至到第n3行下 <br />：n1,n2 d ：将n1行到n2行之间的内容删除 <br />：w ：保存当前文件 <br />：e filename：打开文件filename进行编辑 <br />：x：保存当前文件并退出 <br />：q：退出vi <br />：q!：不保存文件并退出vi <br />：!command：执行shell命令command <br />：n1,n2 w!command：将文件中n1行至n2行的内容作为command的输入并执行之，若不指定n1，n2，则表示将整个文件内容作为command的输入 <br />：r!command：将命令command的输出结果放到当前行 <br /><br /><span style="FONT-WEIGHT: bold">寄存器操作</span><br />"?nyy：将当前行及其下n行的内容保存到寄存器？中，其中?为一个字母，n为一个数字 <br />"?nyw：将当前行及其下n个字保存到寄存器？中，其中?为一个字母，n为一个数字 <br />"?nyl：将当前行及其下n个字符保存到寄存器？中，其中?为一个字母，n为一个数字 <br />"?p：取出寄存器？中的内容并将其放到光标位置处。这里？可以是一个字母，也可以是一个数字 <br />ndd：将当前行及其下共n行文本删除，并将所删内容放到1号删除寄存器中。</p>
		</span>
		<p>
				<span>
				</span>
		</p>
		<span>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span style="COLOR: blue">
								<strong>光标控制命令</strong>
						</span>
						<span style="COLOR: blue">
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>命令</span>
						<span>
								<span>
								</span>
						</span>
						<span>光标移动</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>h</span>
						<span>或</span>
						<span>^h<span></span></span>
						<span>向左移一个字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>j</span>
						<span>或</span>
						<span>^j</span>
						<span>或</span>
						<span>^n<span></span></span>
						<span>向下移一行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>k</span>
						<span>或</span>
						<span>^p<span></span></span>
						<span>向上移一行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>l</span>
						<span>或空格</span>
						<span>
								<span>
								</span>
						</span>
						<span>向右移一个字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>G<span></span></span>
						<span>移到文件的最后一行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>nG<span></span></span>
						<span>移到文件的第</span>
						<span>n</span>
						<span>行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>w<span></span></span>
						<span>移到下一个字的开头</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>W<span></span></span>
						<span>移到下一个字的开头，忽略标点符号</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>b<span></span></span>
						<span>移到前一个字的开头</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>B<span></span></span>
						<span>移到前一个字的开头，忽略标点符号</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>L<span></span></span>
						<span>移到屏幕的最后一行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>M<span></span></span>
						<span>移到屏幕的中间一行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>H<span></span></span>
						<span>移到屏幕的第一行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>e<span></span></span>
						<span>移到下一个字的结尾</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>E<span></span></span>
						<span>移到下一个字的结尾，忽略标点符号</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>(<span></span></span>
						<span>移到句子的开头</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>)<span></span></span>
						<span>移到句子的结尾</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>{<span></span></span>
						<span>移到段落的开头</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>}<span></span></span>
						<span>移到下一个段落的开头</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>0</span>
						<span>或</span>
						<span>|<span></span></span>
						<span>移到当前行的第一列</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>n|<span></span></span>
						<span>移到当前行的第</span>
						<span>n</span>
						<span>列</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>^<span></span></span>
						<span>移到当前行的第一个非空字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>＄<span></span></span>
						<span>移到当前行的最后一个字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>+</span>
						<span>或</span>
						<span>return<span></span></span>
						<span>移到下一行的第一个字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>-<span></span></span>
						<span>移到前一行的第一个非空字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<strong>
								<span style="COLOR: blue">在</span>
								<span style="COLOR: blue">vi</span>
								<span style="COLOR: blue">中添加文本</span>
						</strong>
						<span style="COLOR: blue">
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>命令</span>
						<span>
								<span>
								</span>
						</span>
						<span>插入动作</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>a<span></span></span>
						<span>在光标后插入文本</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>A<span></span></span>
						<span>在当前行插入文本</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>i<span></span></span>
						<span>在光标前插入文本</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>I<span></span></span>
						<span>在当前行前插入文本</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>o<span></span></span>
						<span>在当前行的下边插入新行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>O<span></span></span>
						<span>在当前行的上边插入新行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>:r file<span></span></span>
						<span>读入文件</span>
						<span>file</span>
						<span>内容，并插在当前行后</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>:nr file<span></span></span>
						<span>读入文件</span>
						<span>file</span>
						<span>内容，并插在第</span>
						<span>n</span>
						<span>行后</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>escape<span></span></span>
						<span>回到命令模式</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>^v char<span></span></span>
						<span>插入时忽略</span>
						<span>char</span>
						<span>的指定意义，这是为了插入特殊字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<strong>
								<span style="COLOR: blue">在</span>
								<span style="COLOR: blue">vi</span>
								<span style="COLOR: blue">中删除文本</span>
						</strong>
						<span style="COLOR: blue">
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>命令</span>
						<span>
								<span>
								</span>
						</span>
						<span>删除操作</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>x<span></span></span>
						<span>删除光标处的字符，可以在</span>
						<span>x</span>
						<span>前加上需要删除的字符数目</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>nx<span></span></span>
						<span>从当前光标处往后删除</span>
						<span>n</span>
						<span>个字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>X<span></span></span>
						<span>删除光标前的字符，可以在</span>
						<span>X</span>
						<span>前加上需要删除的字符数目</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>nX<span></span></span>
						<span>从当前光标处往前删除</span>
						<span>n</span>
						<span>个字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>dw<span></span></span>
						<span>删至下一个字的开头</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>ndw<span></span></span>
						<span>从当前光标处往后删除</span>
						<span>n</span>
						<span>个字</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>dG<span></span></span>
						<span>删除行，直到文件结束</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>dd<span></span></span>
						<span>删除整行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>ndd<span></span></span>
						<span>从当前行开始往后删除</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>db<span></span></span>
						<span>删除光标前面的字</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>ndb<span></span></span>
						<span>从当前行开始往前删除</span>
						<span>n</span>
						<span>字</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>:n,md<span></span></span>
						<span>从第</span>
						<span>m</span>
						<span>行开始往前删除</span>
						<span>n</span>
						<span>行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>d</span>
						<span>或</span>
						<span>d＄<span></span></span>
						<span>从光标处删除到行尾</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>dcursor_command<span></span></span>
						<span>删除至光标命令处，如</span>
						<span>dG</span>
						<span>将从当产胆行删除至文件的末尾</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>^h</span>
						<span>或</span>
						<span>backspace<span></span></span>
						<span>插入时，删除前面的字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>^w<span></span><span></span></span>
						<span>插入时，删除前面的字</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<strong>
								<span style="COLOR: blue">修改</span>
								<span style="COLOR: blue">vi</span>
								<span style="COLOR: blue">文本</span>
						</strong>
						<span style="COLOR: blue">
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>每个命令前面的数字表示该命令重复的次数</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>命令</span>
						<span>
								<span>
								</span>
						</span>
						<span>替换操作</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>rchar<span></span></span>
						<span>用</span>
						<span>char</span>
						<span>替换当前字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>R text escape<span></span></span>
						<span>用</span>
						<span>text</span>
						<span>替换当前字符直到换下</span>
						<span>Esc</span>
						<span>键</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>stext escape<span></span></span>
						<span>用</span>
						<span>text</span>
						<span>代替当前字符</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>S</span>
						<span>或</span>
						<span>cctext escape<span></span></span>
						<span>用</span>
						<span>text</span>
						<span>代替整行</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>cwtext escape<span></span></span>
						<span>将当前字改为</span>
						<span>text</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>Ctext escape<span></span></span>
						<span>将当前行余下的改为</span>
						<span>text</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>cG escape<span></span></span>
						<span>修改至文件的末尾</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>ccursor_cmd text escape<span></span></span>
						<span>从当前位置处到光标命令位置处都改为</span>
						<span>text</span>
				</p>
				<p style="MARGIN: 0cm 0cm 0pt">
						<span>
						</span>
				</p>
				<span>
						<p style="MARGIN: 0cm 0cm 0pt">
								<strong>
										<span style="COLOR: blue">在</span>
										<span style="COLOR: blue">vi</span>
										<span style="COLOR: blue">中查找与替换</span>
								</strong>
								<span style="COLOR: blue">
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>命令</span>
								<span>
										<span>
										</span>
								</span>
								<span>查找与替换操作</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>/text<span></span></span>
								<span>在文件中向前查找</span>
								<span>text</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>?text<span></span></span>
								<span>在文件中向后查找</span>
								<span>text</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>n<span></span></span>
								<span>在同一方向重复查找</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>N<span></span></span>
								<span>在相反方向重复查找</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>ftext<span></span></span>
								<span>在当前行向前查找</span>
								<span>text</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>Ftext<span></span></span>
								<span>在当前行向后查找</span>
								<span>text</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>ttext<span></span></span>
								<span>在当前行向前查找</span>
								<span>text</span>
								<span>，并将光标定位在</span>
								<span>text</span>
								<span>的第一个字符</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>Ttext<span></span></span>
								<span>在当前行向后查找</span>
								<span>text</span>
								<span>，并将光标定位在</span>
								<span>text</span>
								<span>的第一个字符</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set ic<span></span></span>
								<span>查找时忽略大小写</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set noic<span></span></span>
								<span>查找时对大小写敏感</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
										<strong>
												<font face="新宋体">:</font>
										</strong>
										<em>range</em>
										<font face="新宋体">s/</font>
										<em>pat1</em>
										<font face="新宋体">/</font>
										<em>pat2</em>
										<font face="新宋体">/g</font>
										<span>
										</span>
								</span>
								<span>用</span>
								<span>newtext</span>
								<span>替换</span>
								<span>oldtext</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:m,ns/oldtext/newtext<span></span></span>
								<span>在</span>
								<span>m</span>
								<span>行通过</span>
								<span>n</span>
								<span>，用</span>
								<span>newtext</span>
								<span>替换</span>
								<span>oldtext</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>&amp;<span></span></span>
								<span>重复最后的</span>
								<span>:s</span>
								<span>命令</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:g/text1/s/text2/text3<span></span></span>
								<span>查找包含</span>
								<span>text1</span>
								<span>的行，用</span>
								<span>text3</span>
								<span>替换</span>
								<span>text2</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:g/text/command<span></span></span>
								<span>在所有包含</span>
								<span>text</span>
								<span>的行运行</span>
								<span>command</span>
								<span>所表示的命令</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:v/text/command<span></span></span>
								<span>在所有不包含</span>
								<span>text</span>
								<span>的行运行</span>
								<span>command</span>
								<span>所表示的命令</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<strong>
										<span style="COLOR: blue">在</span>
										<span style="COLOR: blue">vi</span>
										<span style="COLOR: blue">中复制文本</span>
								</strong>
								<span style="COLOR: blue">
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>命令</span>
								<span>
										<span>
										</span>
								</span>
								<span>复制操作</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>yy<span></span></span>
								<span>将当前行的内容放入临时缓冲区</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>nyy<span></span></span>
								<span>将</span>
								<span>n</span>
								<span>行的内容放入临时缓冲区</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>p<span></span></span>
								<span>将临时缓冲区中的文本放入光标后</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>P<span></span></span>
								<span>将临时缓冲区中的文本放入光标前</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>"(a-z)nyy<span></span></span>
								<span>复制</span>
								<span>n</span>
								<span>行放入名字为圆括号内的可命名缓冲区，省略</span>
								<span>n</span>
								<span>表示当前行</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>"(a-z)ndd<span></span></span>
								<span>删除</span>
								<span>n</span>
								<span>行放入名字为圆括号内的可命名缓冲区，省略</span>
								<span>n</span>
								<span>表示当前行</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>"(a-z)p<span></span></span>
								<span>将名字为圆括号的可命名缓冲区的内容放入当前行后</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>"(a-z)P<span></span></span>
								<span>将名字为圆括号的可命名缓冲区的内容放入当前行前</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<strong>
										<span style="COLOR: blue">在</span>
										<span style="COLOR: blue">vi</span>
										<span style="COLOR: blue">中撤消与重复</span>
								</strong>
								<span style="COLOR: blue">
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>命令</span>
								<span>
										<span>
										</span>
								</span>
								<span>撤消操作</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>u<span></span></span>
								<span>撤消最后一次修改</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>U<span></span></span>
								<span>撤消当前行的所有修改</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>.<span></span></span>
								<span>重复最后一次修改</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>,<span></span></span>
								<span>以相反的方向重复前面的</span>
								<span>f</span>
								<span>、</span>
								<span>F</span>
								<span>、</span>
								<span>t</span>
								<span>或</span>
								<span>T</span>
								<span>查找命令</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>;<span></span></span>
								<span>重复前面的</span>
								<span>f</span>
								<span>、</span>
								<span>F</span>
								<span>、</span>
								<span>t</span>
								<span>或</span>
								<span>T</span>
								<span>查找命令</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>"np<span></span></span>
								<span>取回最后第</span>
								<span>n</span>
								<span>次的删除</span>
								<span>(</span>
								<span>缓冲区中存有一定次数的删除内容，一般为</span>
								<span>9)</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>n<span></span></span>
								<span>重复前面的</span>
								<span>/</span>
								<span>或</span>
								<span>?</span>
								<span>查找命令</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>N<span></span></span>
								<span>以相反方向重复前面的</span>
								<span>/</span>
								<span>或</span>
								<span>?</span>
								<span>命令</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<strong>
										<span style="COLOR: blue">保存文本和退出</span>
										<span style="COLOR: blue">vi</span>
								</strong>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>命令</span>
								<span>
										<span>
										</span>
								</span>
								<span>保存和</span>
								<span>/</span>
								<span>或退出操作</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:w<span></span></span>
								<span>保存文件但不退出</span>
								<span>vi</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:w file<span></span></span>
								<span>将修改保存在</span>
								<span>file</span>
								<span>中但不退出</span>
								<span>vi</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:wq</span>
								<span>或</span>
								<span>ZZ</span>
								<span>或</span>
								<span>:x<span></span></span>
								<span>保存文件并退出</span>
								<span>vi</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:q!<span></span></span>
								<span>不保存文件，退出</span>
								<span>vi</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:e!<span></span></span>
								<span>放弃所有修改，从上次保存文件开始再编辑</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<strong>
										<span style="COLOR: blue">vi</span>
										<span style="COLOR: blue">中的选项</span>
								</strong>
								<span style="COLOR: blue">
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>选项</span>
								<span>
										<span>
										</span>
								</span>
								<span>作用</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set all<span></span></span>
								<span>打印所有选项</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set nooption<span></span></span>
								<span>关闭</span>
								<span>option</span>
								<span>选项</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set nu<span></span></span>
								<span>每行前打印行号</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set showmode<span></span></span>
								<span>显示是输入模式还是替换模式</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set noic<span></span></span>
								<span>查找时忽略大小写</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set list<span></span></span>
								<span>显示制表符</span>
								<span>(^I)</span>
								<span>和行尾符号</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set ts=8<span></span></span>
								<span>为文本输入设置</span>
								<span>tab stops</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:set window=n<span></span></span>
								<span>设置文本窗口显示</span>
								<span>n</span>
								<span>行</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:syntax on                 语法加亮<br /></span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span style="COLOR: blue">
										<br />
										<br />
										<br />
								</span>
								<span style="COLOR: blue">
										<strong>VI的状态</strong>
								</span>
								<span style="COLOR: blue">
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>选项</span>
								<span>
										<span>
										</span>
								</span>
								<span>作用</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:.=<span></span></span>
								<span>打印当前行的行号</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:=<span></span></span>
								<span>打印文件中的行数</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>^g<span></span></span>
								<span>显示文件名、当前的行号、文件的总行数和文件位置的百分比</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>:l<span></span></span>
								<span>使用字母</span>
								<span>"l"</span>
								<span>来显示许多的特殊字符，如制表符和换行符</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span style="COLOR: blue">
										<strong>在文本中定位段落和放置标记</strong>
								</span>
								<span style="COLOR: blue">
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>选项</span>
								<span>
										<span>
										</span>
								</span>
								<span>作用</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>{<span></span></span>
								<span>在第一列插入</span>
								<span>{</span>
								<span>来定义一个段落</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>[[<span></span></span>
								<span>回到段落的开头处</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>]]<span></span></span>
								<span>向前移到下一个段落的开头处</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>m(a-z)<span></span></span>
								<span>用一个字母来标记当前位置，如用</span>
								<span>mz</span>
								<span>表示标记</span>
								<span>z</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>'(a-z)<span></span></span>
								<span>将光标移动到指定的标记，如用</span>
								<span>'z</span>
								<span>表示移动到</span>
								<span>z</span>
						</p>
						<p style="MARGIN: 0cm 0cm 0pt">
								<span>
								</span>
						</p>
						<span>
								<p style="MARGIN: 0cm 0cm 0pt">
										<strong>
												<span style="COLOR: blue">在</span>
												<span style="COLOR: blue">vi</span>
												<span style="COLOR: blue">中连接行</span>
										</strong>
										<span style="COLOR: blue">
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>选项</span>
										<span>
												<span>
												</span>
										</span>
										<span>作用</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>J<span></span></span>
										<span>将下一行连接到当前行的末尾</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>nJ<span></span></span>
										<span>连接后面</span>
										<span>n</span>
										<span>行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span style="COLOR: blue">
												<strong>光标放置与屏幕调整</strong>
										</span>
										<span style="COLOR: blue">
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>选项</span>
										<span>
												<span>
												</span>
										</span>
										<span>作用</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>H<span></span><span></span></span>
										<span>将光标移动到屏幕的顶行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>nH<span></span><span></span></span>
										<span>将光标移动到屏幕顶行下的第</span>
										<span>n</span>
										<span>行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>M<span></span><span></span></span>
										<span>将光标移动到屏幕的中间</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>L<span></span><span></span></span>
										<span>将光标移动到屏幕的底行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>nL<span></span><span></span></span>
										<span>将光标移动到屏幕底行上的第</span>
										<span>n</span>
										<span>行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>^e(ctrl+e)<span></span></span>
										<span>将屏幕上滚一行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>^y<span></span><span></span></span>
										<span>将屏幕下滚一行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>^u<span></span><span></span></span>
										<span>将屏幕上滚半页</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>^d<span></span><span></span></span>
										<span>将屏幕下滚半页</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>^b<span></span><span></span></span>
										<span>将屏幕上滚一页</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>^f<span></span><span></span></span>
										<span>将屏幕下滚一页</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>^l<span></span><span></span></span>
										<span>重绘屏幕</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>z-return<span></span><span></span></span>
										<span>将当前行置为屏幕的顶行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>nz-return<span></span><span></span></span>
										<span>将当前行下的第</span>
										<span>n</span>
										<span>行置为屏幕的顶行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>z.<span></span><span></span></span>
										<span>将当前行置为屏幕的中央</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>nz.<span></span><span></span></span>
										<span>将当前行上的第</span>
										<span>n</span>
										<span>行置为屏幕的中央</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>z-<span></span><span></span></span>
										<span>将当前行置为屏幕的底行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>nz-<span></span><span></span></span>
										<span>将当前行上的第</span>
										<span>n</span>
										<span>行置为屏幕的底行</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<strong>
												<span style="COLOR: blue">vi</span>
												<span style="COLOR: blue">中的</span>
												<span style="COLOR: blue">shell</span>
												<span style="COLOR: blue">转义命令</span>
										</strong>
										<span style="COLOR: blue">
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>选项</span>
										<span>
												<span>
												</span>
										</span>
										<span>作用</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:!command<span></span></span>
										<span>执行</span>
										<span>shell</span>
										<span>的</span>
										<span>command</span>
										<span>命令，如</span>
										<span>:!ls</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:!!<span></span><span></span></span>
										<span>执行前一个</span>
										<span>shell</span>
										<span>命令</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:r!command<span></span></span>
										<span>读取</span>
										<span>command</span>
										<span>命令的输入并插入，如</span>
										<span>:r!ls</span>
										<span>会先执行</span>
										<span>ls</span>
										<span>，然后读入内容</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:w!command<span></span></span>
										<span>将当前已编辑文件作为</span>
										<span>command</span>
										<span>命令的标准输入并执行</span>
										<span>command</span>
										<span>命令，如</span>
										<span>:w!grep all</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:cd directory<span></span></span>
										<span>将当前工作目录更改为</span>
										<span>directory</span>
										<span>所表示的目录</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:sh<span></span><span></span></span>
										<span>将启动一个子</span>
										<span>shell</span>
										<span>，使用</span>
										<span>^d(ctrl+d)</span>
										<span>返回</span>
										<span>vi</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:so file<span></span><span></span></span>
										<span>在</span>
										<span>shell</span>
										<span>程序</span>
										<span>file</span>
										<span>中读入和执行命令</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<strong>
												<span style="COLOR: blue">vi</span>
												<span style="COLOR: blue">中的宏与缩写</span>
										</strong>
										<span style="COLOR: blue">
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>(</span>
										<span>避免使用控制键和符号，不要使用字符</span>
										<span>K</span>
										<span>、</span>
										<span>V</span>
										<span>、</span>
										<span>g</span>
										<span>、</span>
										<span>q</span>
										<span>、</span>
										<span>v</span>
										<span>、</span>
										<span>*</span>
										<span>、</span>
										<span>=</span>
										<span>和功能键</span>
										<span>)</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>选项</span>
										<span>
												<span>
												</span>
												<span>
												</span>
										</span>
										<span>作用</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt 125.8pt; TEXT-INDENT: -125.8pt">
										<span>:map key command_seq<span></span></span>
										<span>定义一个键来运行</span>
										<span>command_seq</span>
										<span>，如</span>
										<span>:map e ea</span>
										<span>，无论什么时候都可以</span>
										<span>e</span>
										<span>移到一个字的末尾来追加文本</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:map<span></span><span></span></span>
										<span>在状态行显示所有已定义的宏</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:umap key<span></span><span></span></span>
										<span>删除该键的宏</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt 126pt; TEXT-INDENT: -125.8pt">
										<span>:ab string1 string2<span></span></span>
										<span>定义一个缩写，使得当插入</span>
										<span>string1</span>
										<span>时，用</span>
										<span>string2</span>
										<span>替换</span>
										<span>string1</span>
										<span>。当要插入文本时，键入</span>
										<span>string1</span>
										<span>然后按</span>
										<span>Esc</span>
										<span>键，系统就插入了</span>
										<span>string2</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:ab<span></span><span></span></span>
										<span>显示所有缩写</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:una string<span></span><span></span></span>
										<span>取消</span>
										<span>string</span>
										<span>的缩写</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<strong>
												<span style="COLOR: blue">在</span>
												<span style="COLOR: blue">vi</span>
												<span style="COLOR: blue">中缩进文本</span>
										</strong>
										<span style="COLOR: blue">
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>
										</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>选项</span>
										<span>
												<span>
												</span>
												<span>
												</span>
										</span>
										<span>作用</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>^i(ctrl+i)</span>
										<span>或</span>
										<span>tab<span></span><span></span></span>
										<span>插入文本时，插入移动的宽度，移动宽度是事先定义好的</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:set ai<span></span><span></span></span>
										<span>打开自动缩进</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>:set sw=n<span></span><span></span></span>
										<span>将移动宽度设置为</span>
										<span>n</span>
										<span>个字符</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt">
										<span>n&lt;&amp;lt;<span></span><span></span></span>
										<span>使</span>
										<span>n</span>
										<span>行都向左移动一个宽度</span>
								</p>
								<p style="MARGIN: 0cm 0cm 0pt 125.8pt; TEXT-INDENT: -125.8pt">
										<span>n&gt;&gt;<span></span></span>
										<span>使</span>
										<span>n</span>
										<span>行都向右移动一个宽度，例如</span>
										<span>3&gt;&gt;</span>
										<span>就将接下来的三行每行都向右移动一个移动宽度</span>
								</p>
						</span>
				</span>
		</span>
<img src ="http://www.cppblog.com/guangping/aggbug/59516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2008-08-21 13:08 <a href="http://www.cppblog.com/guangping/archive/2008/08/21/59516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>菩提本无树，明镜亦非台</title><link>http://www.cppblog.com/guangping/archive/2008/08/19/59302.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Tue, 19 Aug 2008 01:13:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2008/08/19/59302.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/59302.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2008/08/19/59302.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/59302.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/59302.html</trackback:ping><description><![CDATA[
		<h2>
		</h2>
		<div id="articlecontent">
				<p>
						<font face="楷体_GB2312" size="3">此乃六祖慧能的悟禅之言，因为其师兄的：身似菩提树，心似明镜台，时时勤拂拭，不使惹尘埃 。六祖感觉悟禅不彻底，于是他吟出了：菩提本无树,明镜亦非台,本来无一物,何处惹尘埃 。</font>
				</p>
				<p>
						<font face="楷体_GB2312" size="3">从字面上讲：菩提树是空的，明镜台也是空的，身与心俱是空的，本来无一物的空，又怎么可能惹尘埃呢?</font>
				</p>
				<p>
						<br />
						<font face="楷体_GB2312">
								<font size="3">    佛对我说：你的心上有尘。我用力地擦拭。<br />　　佛说：你错了，尘是擦不掉的。我于是将心剥了下来.<br />　　佛又说：你又错了，尘本非尘，何来有尘<br />　　我领悟不透，是什么意思？<br />　　我想这是从神秀和慧能那两个偈子引申出来。<br />　　神秀说：“身是菩提树，心如明镜台，时时勤拂拭，勿使惹尘埃。”<br />　　慧能说：“菩提本无树，明镜亦非台，本来无一物，何处惹尘埃。”<br />　　的确，要能够参透这两个偈子的确很难，就是正确的理解也不易。<br />　　参悟不透...<br />　　身是菩提树，心如明镜台，时时勤拂拭，勿使惹尘埃<br />　　众生的身体就是一棵觉悟的智慧树，<br />　　众生的心灵就象一座明亮的台镜。<br />　　要时时不断地将它掸拂擦试，<br />　　不让它被尘垢污染障蔽了光明的本性。<br />　　<br />　　菩提本无树，明镜亦非台，本来无一物，何处惹尘埃<br />　　菩提原本就没有树，<br />　　明亮的镜子也并不是台。<br />　　本来就是虚无没有一物，<br />　　那里会染上什么尘埃?<br />　　现在只能从字面上去理解它，惨悟不透！<br />　　心本无尘，尘即是心。无心无尘，人便死。<br />　　<br />　　其实尘在外，心在内，常拂之，心净无尘；<br />　　尘在内，心在外，常剥之，无尘无心；<br />　　心中有尘，尘本是心，<br />　　何畏心中尘，无尘亦无心??正如慧能所说的 仁者心动<br />　　<br />　　又如道家所说的 道可道非常道<br />　　<br />　　它们的道理是一样的<br />　　佛家讲究万物在心 追求修世<br />　　<br />　　道家讲究无牵无挂 追求避世<br />　　<br />　　佛家想超脱今世 道家则是修行今世 而追究其原理来说都是一种修行<br />　　<br />　　而最终的说的是一种超脱<br />　　<br />　　却不是刻意的寻求<br />　　<br />　　主旨在心<br />　　<br />　　世间人，法无定法，然后知非法法也；<br />　　天下事，了犹未了，何妨以不了了之。 </font>
						</font>
				</p>
				<p>
						<font face="楷体_GB2312" size="3">就我本身来讲，对于世间的事情，万物，我认为，需要一颗宁静的心，去面对这一切。</font>
				</p>
				<!---->
		</div>
<img src ="http://www.cppblog.com/guangping/aggbug/59302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2008-08-19 09:13 <a href="http://www.cppblog.com/guangping/archive/2008/08/19/59302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解循环冗余码CRC</title><link>http://www.cppblog.com/guangping/archive/2008/08/04/57980.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Mon, 04 Aug 2008 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2008/08/04/57980.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/57980.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2008/08/04/57980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/57980.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/57980.html</trackback:ping><description><![CDATA[奇偶校验码作为一种检错码虽然简单,但是漏检率太高。在计算机网络和数据通信中用E得最广泛的检错码,是一种漏检率低得多也便于实现的循环冗余码CRC (Cyclic Redundancy .Code),CRC码又称为多项式码。<br />    任何一个由二进制数位串组成的代码,都可以惟一地与一个只含有0和1两个系数的多项式建立一一对应的关系。例如,代码1010111对应的多项式为X<sub>6</sub>+X<sub>4</sub>+X<sub>2</sub>+X+1,同样.多项式X<sub>5</sub>+X<sub>3</sub>+X<sub>2</sub>+X+1对应的代码为101111。<br />    CRC码在发送端编码和接收端校验时,都可以利用事先约定的生成多项式G(X)来得到。 k位要发送的信息位可对应于一个(k-1)次多项式K(X),r位冗余位则对应于一个(r-1)次多项式R(X),由k位信息位后面加上r位冗余位组成的n=k+r位码字则对应于一个(n-1)次多项式T(X)=X<sup>r</sup>·K(X)+R(X)。例如
<p><img src="http://zk.educity.cn/wljs/images/20069156244.gif" /></p><p>    由信息位产生冗余位的编码过程,就是已知K(X)求R(X)的过程。在CRC码中可以通过找到一个特定的r次多项式G (X)(其最高项Xr的系数恒为1),然后用Xr·K(X)去除以G(X),得到的余式就是R(X)。特别要强调的是,这些多项式中的"+"都是模2加(也即异或运算);此外,这里的除法用的也是模2除法,即除法过程中用到的减法是模2减法,它和模2加法的运算规则一样,都是异或运算,这是一种不考虑加法进位和减法借位的运算,即</p><p>    0+O=0,0+1=1,1+0=1,1+1=0<br />    0-0=0,0-1=1,1-0=1,1-1=0</p><p>    在进行基于模2运算的多项式除法时,只要部分余数首位为1,便可上商1,否则上商0。然后按模2减法求得余数,该余数不计最高位。当被除数逐位除完时,最后得到比除数少一位的余数。此余数即为冗余位,将其添加在信息位后便构成CRC码字。<br />    仍以上例中K(X)=X<sup>6</sup>+X<sup>4</sup>+X<sup>3</sup>+1为例(即信息位为1011001),若G(X)=X<sup>4</sup>+X<sup>3</sup>+1<br />(对应代码11001),取r=4,则X<sup>4</sup>·K(X)=X<sup>10</sup>+X<sup>8</sup>+X<sup>7</sup>+X<sup>4</sup>(对应代码为0110010000),其由模2除法求余式R(X)的过程所示如下:</p><p><img src="http://zk.educity.cn/wljs/images/20069159946.gif" /><br />    得到的最后余数为1010,这就是冗余位,对应R(X)=X3+X。<br />    由于R(X)是X<sup>r</sup>·K(X)除以G(X)的余式,那么下列关系式必然满足<br />    X<sup>r</sup>·K(X)=G(X)Q(X)+R(X)<br />    其中Q(X)为商式。根据模二运算规则R(X)+R(X)=0的特点,可将上式改记为</p><p>    [X<sup>r</sup>-K(X)+R(X)]/G(X)=Q(X)</p><p>    即    T(X)/G(X)=Q(X)</p><p>    由此可见,信道上发送的码字多项式T(X)=Xr-K(X)+R(X)。若传输过程无错，则接收方收到的码字也对应于此多项式,也即接收到的码字多项式能被G(X)整除。因而接收端的校验过程就是将接收到的码字多项式除以G(X)的过程。若余式为零则认为传输元差错;若余式不为零则传输有差错。</p><p><img src="http://zk.educity.cn/wljs/images/20069151070.gif" /></p><p>    例如,前述例子中若码字10110011010经传输后由于受噪声的干扰,在接收端变成为10110011100,则求余式的除法如下:<br />求得的余式不为零,相当于在码字上面半加上了差错模式00000000110。差错模式对应的多项式记为E(X),上例中E(X)=X2+X。有差错时,接收端收到的不再是T(X),而是T(X)与E(X)之模二加,即<br />    [T(X)+E(X)]/G(X)=T(X)/G(X)+E(X)/G(X)<br />若E(X)/G(X)=0,则这种差错就能检测出来;若E(X)/G(X)=0,那么由于接收到的码字多项式仍然可被G(X)整除,错误就检测不出来,也即发生了漏检。</p><p>    理论上可以证明循环冗余校验码的检错能力有以下特点:<br />    (1)可检测出所有奇数位错。<br />    (2)可检测出所有双比特的错。<br />    (3)可检测出所有小于、等于校验位长度的突发错。</p><p><clk>    CRC码是由r-K(X)除以某个选定的多项式后产生的,所以该多现式称生成多项式。一般来说,生成多项式位数越多校验能力越强。但并不是任何一个r+1位的二进制数都可以做生成多项式。<nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="kwC(event,0)" onmouseout="kwL(event,this)">目前</nobr>广泛使用的生成多项式主要有以下四种:</clk><br /><img src="http://zk.educity.cn/wljs/images/20069158141.gif" /></p><img src ="http://www.cppblog.com/guangping/aggbug/57980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2008-08-04 16:57 <a href="http://www.cppblog.com/guangping/archive/2008/08/04/57980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的左值和右值</title><link>http://www.cppblog.com/guangping/archive/2008/04/23/47889.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Wed, 23 Apr 2008 03:40:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2008/04/23/47889.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/47889.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2008/04/23/47889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/47889.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/47889.html</trackback:ping><description><![CDATA[1.  概念
变量和文字常量都有存储区，并且有相关的类型，区别在于变量是可寻址的；
<br />
对于每个变量，都有2个值与其相关联：<br /> 1&gt;数据值，存储在某个内存地址中，也称右值（rvalue），右值是被读取的值（read value），文字常量和变量都可被用于右值。
<br /> 2&gt;地址值，即存储数据值的那块内存地址，也称左值（lvalue），文字常量不能被用作左值。
<br /><br />2 . 问题
给表达式加上括号：<br /> ++a--
<br />结果 ++(a--)
<br />这个表达式是非法的，因为前增量操作要求一个可修改的左值，而 "a--" 不是左值（即右值）<br /><br /> 3 . 前增量和后增量的区别
<br />早期的c语言教材，for循环语句通常写成：<br />for(int i=0;i&lt;10;i++)
<br />而现在多为：
<br />for(int i=0;i&lt;10;++i)
两者有区别吗？
<br />a++ 即是返回 a的值，然后变量 a 加 1，返回需要产生一个临时变量类似于
<br />{
int temp = a;
<br />   a=a+1;
<br />   return temp;  //返回右值
}
<br /><br />++a 则为：
<br />{
a=a+1;
<br />   return &amp;a;    //返回左值
}
<br />显然，前增量不需要中间变量，效率更高。  <img src ="http://www.cppblog.com/guangping/aggbug/47889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2008-04-23 11:40 <a href="http://www.cppblog.com/guangping/archive/2008/04/23/47889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>typedef用法小结</title><link>http://www.cppblog.com/guangping/archive/2008/04/08/46519.html</link><dc:creator>王光平</dc:creator><author>王光平</author><pubDate>Tue, 08 Apr 2008 08:21:00 GMT</pubDate><guid>http://www.cppblog.com/guangping/archive/2008/04/08/46519.html</guid><wfw:comment>http://www.cppblog.com/guangping/comments/46519.html</wfw:comment><comments>http://www.cppblog.com/guangping/archive/2008/04/08/46519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guangping/comments/commentRss/46519.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guangping/services/trackbacks/46519.html</trackback:ping><description><![CDATA[
		<font face="Courier New">
				<font size="4">这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等地方都大量的用到.但是有些地方还不是很清楚,今天下午,就想好好研究一下.上网搜了一下,有不少资料.归纳一下:<br />来源一:Using typedef to Curb Miscreant Code<br />Typedef 声明有助于创建平台无关类型，甚至能隐藏复杂和难以理解的语法。不管怎样，使用 typedef 能为代码带来意想不到的好处，通过本文你可以学习用 typedef 避免缺欠，从而使代码更健壮。<br />typedef 声明，简称 typedef，为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观，意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型，从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。<br />如何创建平台无关的数据类型，隐藏笨拙且难以理解的语法?<br />使用 typedefs 为现有类型创建同义字。<br />定义易于记忆的类型名<br />　　typedef 使用最多的地方是创建易于记忆的类型名，用它来归档程序员的意图。类型出现在所声明的变量名字中，位于 ''typedef'' 关键字右边。例如：<br />typedef int size;<br />　　此声明定义了一个 int 的同义字，名字为 size。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 size：<br />void measure(size * psz);<br />size array[4];<br />size len = file.getlength();<br />std::vector vs;<br />　　typedef 还可以掩饰符合类型，如指针和数组。例如，你不用象下面这样重复定义有 81 个字符元素的数组：<br />char line[81];<br />char text[81];<br />定义一个 typedef，每当要用到相同类型和大小的数组时，可以这样：<br />typedef char Line[81];<br />Line text, secondline;<br />getline(text);<br />同样，可以象下面这样隐藏指针语法：<br />typedef char * pstr;<br />int mystrcmp(pstr, pstr);<br />　　这里将带我们到达第一个 typedef 陷阱。标准函数 strcmp()有两个‘const char *'类型的参数。因此，它可能会误导人们象下面这样声明 mystrcmp()：<br />int mystrcmp(const pstr, const pstr);<br />　　这是错误的，按照顺序，‘const pstr'被解释为‘char * const'（一个指向 char 的常量指针），而不是‘const char *'（指向常量 char 的指针）。这个问题很容易解决：<br />typedef const char * cpstr;<br />int mystrcmp(cpstr, cpstr); // 现在是正确的<br />记住：不管什么时候，只要为指针声明 typedef，那么都要在最终的 typedef 名称中加一个 const，以使得该指针本身是常量，而不是对象。<br />代码简化<br />　　上面讨论的 typedef 行为有点像 #define 宏，用其实际类型替代同义字。不同点是 typedef 在编译时被解释，因此让编译器来应付超越预处理器能力的文本替换。例如：<br />typedef int (*PF) (const char *, const char *);<br />　　这个声明引入了 PF 类型作为函数指针的同义字，该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。如果要使用下列形式的函数声明，那么上述这个 typedef 是不可或缺的：<br />PF Register(PF pf);<br />　　Register() 的参数是一个 PF 类型的回调函数，返回某个函数的地址，其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef，我们是如何实现这个声明的：<br />int (*Register (int (*pf)(const char *, const char *)))<br />(const char *, const char *);<br />　　很少有程序员理解它是什么意思，更不用说这种费解的代码所带来的出错风险了。显然，这里使用 typedef 不是一种特权，而是一种必需。持怀疑态度的人可能会问："OK，有人还会写这样的代码吗？"，快速浏览一下揭示 signal()函数的头文件 ，一个有同样接口的函数。<br />typedef 和存储类关键字（storage class specifier）<br />　　这种说法是不是有点令人惊讶，typedef 就像 auto，extern，mutable，static，和 register 一样，是一个存储类关键字。这并是说 typedef 会真正影响对象的存储特性；它只是说在语句构成上，typedef 声明看起来象 static，extern 等类型的变量声明。下面将带到第二个陷阱：<br />typedef register int FAST_COUNTER; // 错误<br />　　编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置，在 typedef 声明中不能用 register（或任何其它存储类关键字）。<br />促进跨平台开发<br />　　typedef 有另外一个重要的用途，那就是定义机器无关的类型，例如，你可以定义一个叫 REAL 的浮点类型，在目标机器上它可以i获得最高的精度：<br />typedef long double REAL;<br />在不支持 long double 的机器上，该 typedef 看起来会是下面这样：<br />typedef double REAL;<br />并且，在连 double 都不支持的机器上，该 typedef 看起来会是这样：、<br />typedef float REAL;<br />　 　你不用对源代码做任何修改，便可以在每一种平台上编译这个使用 REAL 类型的应用程序。唯一要改的是 typedef 本身。在大多数情况下，甚至这个微小的变动完全都可以通过奇妙的条件编译来自动实现。不是吗? 标准库广泛地使用 typedef 来创建这样的平台无关类型：size_t，ptrdiff 和 fpos_t 就是其中的例子。此外，象 std::string 和 std::ofstream 这样的 typedef 还隐藏了长长的，难以理解的模板特化语法，例如：basic_string，allocator&gt; 和 basic_ofstream&gt;。<br />作者简介<br />　　Danny Kalev 是一名通过认证的系统分析师，专攻 C++ 和形式语言理论的软件工程师。1997 年到 2000 年期间，他是 C++ 标准委员会成员。最近他以优异成绩完成了他在普通语言学研究方面的硕士论文。业余时间他喜欢听古典音乐，阅读维多利亚时期的文学作品，研究 Hittite、Basque 和 Irish Gaelic 这样的自然语言。其它兴趣包括考古和地理。Danny 时常到一些 C++ 论坛并定期为不同的 C++ 网站和杂志撰写文章。他还在教育机构讲授程序设计语言和应用语言课程。<br />来源二：(http://www.ccfans.net/bbs/dispbbs.asp?boardid=30&amp;;id=4455)<br />C语言中typedef用法<br />1. 基本解释<br />　　typedef为C语言的关键字，作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型（int,char等）和自定义的数据类型（struct等）。<br />　　在编程中使用typedef目的一般有两个，一个是给变量一个易记且意义明确的新名字，另一个是简化一些比较复杂的类型声明。<br />　　至于typedef有什么微妙之处，请你接着看下面对几个问题的具体阐述。<br />　2. typedef &amp; 结构的问题<br />　　当用下面的代码定义一个结构时，编译器报了一个错误，为什么呢？莫非C语言不允许在结构中包含指向它自己的指针吗？请你先猜想一下，然后看下文说明：<br />typedef struct tagNode<br />{<br />　char *pItem;<br />　pNode pNext;<br />} *pNode;<br />　　答案与分析：<br />　　1、typedef的最简单使用<br />typedef long byte_4;<br />　　给已知数据类型long起个新名字，叫byte_4。<br />　　2、 typedef与结构结合使用<br />typedef struct tagMyStruct<br />{<br />　int iNum;<br />　long lLength;<br />} MyStruct;<br />　　这语句实际上完成两个操作：<br />　　1) 定义一个新的结构类型<br />struct tagMyStruct<br />{<br />　int iNum;<br />　long lLength;<br />};<br />　　分析：tagMyStruct称为“tag”，即“标签”，实际上是一个临时名字，struct 关键字和tagMyStruct一起，构成了这个结构类型，不论是否有typedef，这个结构都存在。<br />　　我们可以用struct tagMyStruct varName来定义变量，但要注意，使用tagMyStruct varName来定义变量是不对的，因为struct 和tagMyStruct合在一起才能表示一个结构类型。<br />　　2) typedef为这个新的结构起了一个名字，叫MyStruct。<br />typedef struct tagMyStruct MyStruct;<br />　　因此，MyStruct实际上相当于struct tagMyStruct，我们可以使用MyStruct varName来定义变量。<br />　　答案与分析<br />　　C语言当然允许在结构中包含指向它自己的指针，我们可以在建立链表等数据结构的实现上看到无数这样的例子，上述代码的根本问题在于typedef的应用。<br />　　根据我们上面的阐述可以知道：新结构建立的过程中遇到了pNext域的声明，类型是pNode，要知道pNode表示的是类型的新名字，那么在类型本身还没有建立完成的时候，这个类型的新名字也还不存在，也就是说这个时候编译器根本不认识pNode。<br />　　解决这个问题的方法有多种：<br />　　1)、<br />typedef struct tagNode<br />{<br />　char *pItem;<br />　struct tagNode *pNext;<br />} *pNode;<br />　　2)、<br />typedef struct tagNode *pNode;<br />struct tagNode<br />{<br />　char *pItem;<br />　pNode pNext;<br />};<br />　　注意：在这个例子中，你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。<br />　　3)、规范做法：<br />struct tagNode<br />{<br />　char *pItem;<br />　struct tagNode *pNext;<br />};<br />typedef struct tagNode *pNode;<br />　3. typedef &amp; #define的问题<br />　　有下面两种定义pStr数据类型的方法，两者有什么不同？哪一种更好一点？<br />typedef char *pStr;<br />#define pStr char *;<br />　　答案与分析：<br />　　通常讲，typedef要比#define要好，特别是在有指针的场合。请看例子：<br />typedef char *pStr1;<br />#define pStr2 char *;<br />pStr1 s1, s2;<br />pStr2 s3, s4;<br />　　在上述的变量定义中，s1、s2、s3都被定义为char *，而s4则定义成了char，不是我们所预期的指针变量，根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。<br />　　#define用法例子：<br />#define f(x) x*x<br />main( )<br />{<br />　int a=6，b=2，c；<br />　c=f(a) / f(b)；<br />　printf("%d \\n"，c)；<br />}<br />　　以下程序的输出结果是: 36。<br />　　因为如此原因，在许多C语言编程规范中提到使用#define定义时，如果定义中包含表达式，必须使用括号，则上述定义应该如下定义才对：<br />#define f(x) (x*x)<br />　　当然，如果你使用typedef就没有这样的问题。<br />　　4. typedef &amp; #define的另一例<br />　　下面的代码中编译器会报一个错误，你知道是哪个语句错了吗？<br />typedef char * pStr;<br />char string[4] = "abc";<br />const char *p1 = string;<br />const pStr p2 = string;<br />p1++;<br />p2++;<br />　　答案与分析：<br />　　是p2++出错了。这个问题再一次提醒我们：typedef和#define不同，它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有区别，都是对变量进行只读限制，只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此，const pStr p2的含义是：限定数据类型为char *的变量p2为只读，因此p2++错误。<br />　　#define与typedef引申谈<br />　　1) #define宏定义有一个特别的长处：可以使用 #ifdef ,#ifndef等来进行逻辑判断，还可以使用#undef来取消定义。<br />　　2) typedef也有一个特别的长处：它符合范围规则，使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内（取决于此变量定义的位置），而宏定义则没有这种特性。<br />　　5. typedef &amp; 复杂的变量声明<br />　　在编程实践中，尤其是看别人代码的时候，常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值，比如：<br />　　下面是三个变量的声明，我想使用typdef分别给它们定义一个别名，请问该如何做？<br />&gt;1：int *(*a[5])(int, char*);<br />&gt;2：void (*b[10]) (void (*)());<br />&gt;3. doube(*)() (*pa)[9];<br />　　答案与分析：<br />　　对复杂变量建立一个类型别名的方法很简单，你只要在传统的变量声明表达式里用类型名替代变量名，然后把关键字typedef加在该语句的开头就行了。<br />&gt;1：int *(*a[5])(int, char*);<br />//pFun是我们建的一个类型别名<br />typedef int *(*pFun)(int, char*);<br />//使用定义的新类型来声明对象，等价于int* (*a[5])(int, char*);<br />pFun a[5];<br />&gt;2：void (*b[10]) (void (*)());<br />//首先为上面表达式蓝色部分声明一个新类型<br />typedef void (*pFunParam)();<br />//整体声明一个新类型<br />typedef void (*pFun)(pFunParam);<br />//使用定义的新类型来声明对象，等价于void (*b[10]) (void (*)());<br />pFun b[10];<br />&gt;3. doube(*)() (*pa)[9];<br />//首先为上面表达式蓝色部分声明一个新类型<br />typedef double(*pFun)();<br />//整体声明一个新类型<br />typedef pFun (*pFunParam)[9];<br />//使用定义的新类型来声明对象，等价于doube(*)() (*pa)[9];<br />pFunParam pa;</font>
		</font>
		<br />
<img src ="http://www.cppblog.com/guangping/aggbug/46519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guangping/" target="_blank">王光平</a> 2008-04-08 16:21 <a href="http://www.cppblog.com/guangping/archive/2008/04/08/46519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>