<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_A Little Fool</title><subtitle type="text">Fool For Free.</subtitle><id>http://feed.cnblogs.com/blog/u/6941/rss</id><updated>2011-05-07T14:06:31Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/6941/rss"/><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/10/14/1851717.html</id><title type="text">[翻译]进化游戏的层次结构 - 用组件来重构你的游戏实体</title><summary type="text">我自己翻译的一篇文章，希望能对你有所帮助。原文链接：http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ 进化游戏的层次结构　　- 用组件来重构你的游戏实体直到最近几年，游戏程序员一直使用深层次结构的类表示游戏实体。现在的潮流开始逐渐从深层次的结构，到仅仅是把游戏实体对象作为聚合组件的方向转变。这篇文章解释了这些转变意味着什么，...</summary><published>2010-10-14T13:26:00Z</published><updated>2010-10-14T13:26:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/10/14/1851717.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/10/14/1851717.html"/><content type="html">&lt;p&gt;&lt;em&gt;我自己翻译的一篇文章，希望能对你有所帮助。&#xD;
&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;原文链接：&lt;a title="http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/" href="http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/"&gt;http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/&lt;/a&gt;&lt;/em&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;h3 align="Center"&gt; 进化游戏的层次结构&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h1 align="Center"&gt;　　- 用组件来重构你的游戏实体&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;直到最近几年，游戏程序员一直使用深层次结构的类表示游戏实体。现在的潮流开始逐渐从深层次的结构，到仅仅是把游戏实体对象作为聚合组件的方向转变。这篇文章解释了这些转变意味着什么，并且探讨了用这种方式带来的的好处和实际情况中的使用。我将会描述我个人的一些经验，怎样在大项目中实现这个系统，当然也包括怎样去卖你的方案给别的程序员和经理。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;游戏实体&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;不同的游戏有不同的需求，就像游戏实体应该需要什么一样。但是在大多数的游戏里，实体的概念是十分的相似的。一个游戏实体就是一个在游戏世界里的对象，通常这个对象对于玩家来说是可见的，并且通常它还能四处移动。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;一些实体的例子：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;子弹&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;小轿车&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;坦克&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;手榴弹&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;枪&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;英雄&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;行人&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;外星人&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;喷气式飞行器&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;医疗包&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;石头&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;实体通常可以做很多事情。下面是一些事情你也许想要实体去做的：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;运行一个脚本&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;移动&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;表现的像个死板的东西&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;发射粒子&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;播放特定的声音&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;能被玩家放在背包里&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;能被玩家穿上&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;爆炸&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;表现的有磁性的&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;被玩家瞄准&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;沿着一条路径走&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-left: 48pt; text-indent: -21pt;"&gt;&lt;span style="font-family: Wingdings;"&gt;&lt;span&gt;l&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;动画&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;传统的深层次结构&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;传统的表示一组实体集的方式就像是在分解我们想要去表的实体集。这样做通常开始的意图是好的，但是随着游戏的开发进度这些东西经常要变动&lt;/span&gt;&amp;#8212;&lt;span style="font-family: 宋体;"&gt;尤其是当一个游戏引擎被不同的游戏重新使用时。我们通常最后的设计出如&lt;/span&gt; &lt;span style="font-family: 宋体;"&gt;图&lt;/span&gt;B-1&lt;span style="font-family: 宋体;"&gt;那样，但是实际上的类层次结构比图中节点还要多。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center; text-indent: 27pt;" align="center"&gt;&lt;img src="http://cowboyprogramming.com/images/eyh/Fig-1.gif" alt="" height="322" width="180" /&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center; text-indent: 27pt;" align="center"&gt;&lt;span style="font-family: 宋体;"&gt;图&lt;/span&gt;B-1&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;随着开发的进行，我们通常需要增加很多不同的功能到实体上。对象必须要么封装自己封装功能，要么从有那个功能的别的对象那里继承过来。经常性的功能被加载接近类层次结构的根节点上，比如说&lt;/span&gt;CEntity&lt;span style="font-family: 宋体;"&gt;类。这样做有一个好处，就是所有派生类都能有那些功能。但是不好的地方是会被这些类带来相关的开销。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;即使是非常简单的对象比如石头或者是手榴弹，到最后会有大量的额外功能（和相关的成员变量，或者是不必要执行的成员函数）。传统的游戏对象层次结构经常到最后要创建一个被称作&lt;/span&gt;&amp;#8221;&lt;span style="font-family: 宋体;"&gt;团迹&lt;/span&gt;&amp;#8221;(&lt;span style="font-family: 宋体;"&gt;胖球&lt;/span&gt;)(the blob)&lt;span style="font-family: 宋体;"&gt;的东西。胖球是经典的反模式之一，表现为一个巨大的单类（或者是有大量的分支在类的层次结构上），拥有大量的复杂的互相交织的功能。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;当胖球反模式经常在对象层次结构的根节点附近出现，它也就显现在叶子节点上了（译注：因为叶子节点是继承自根的）。最有可能的候选者因该是表示玩家的类。由于游戏通常是针对单一角色而编写的程序，因此表示角色的对象经常有大量的功能。这经常是实现为在一个类里比如&lt;/span&gt;CPlayer&lt;span style="font-family: 宋体;"&gt;类，有大量的成员函数。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;实现这么多功能在层次结构的根节点附近的结果就是给叶对象大量不需要功能的过重包袱。不管怎么样，用相反的实现方法，在叶子节点上实现大量的功能，同样是不幸的结果。功能现在被分解了，所以只有专门为那个对象编程的特定功能才能使用它。程序员经常复制一样的代码到已经被不同的对象实现的镜子函数里。最终，需要重新组织类的层次结构这种肮脏的重构来移动和组合功能。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;先来一个例子吧，有一个对象在在物理作用下表现为刚体的功能。不是所有的对象需要做到这样。你可以在图&lt;/span&gt;B-1&lt;span style="font-family: 宋体;"&gt;里看到的那样，我们仅仅让&lt;/span&gt;Crock&lt;span style="font-family: 宋体;"&gt;和&lt;/span&gt;CGrenade&lt;span style="font-family: 宋体;"&gt;类从&lt;/span&gt;CRigid&lt;span style="font-family: 宋体;"&gt;类派生。如果我们想要将此功能应用到车子上会发生什么呢？你不的不把&lt;/span&gt;CRigid&lt;span style="font-family: 宋体;"&gt;类移到层次结构的上面去，让它变得更像我们以前看到的根部的重型胖子模式，所有的的功能都被串成一条类的窄链子从其他最先开始继承的类开始起。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;聚合组件&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;组件方式，现在越来越得到现在的游戏开发的认可，是一种把不同的功能分开放到不同的独立于其他组件的组件上的方法。传统的对象层次结构被免除了，并且一个对象现在被创建为为一个独立的组件的聚合（积聚物）。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;每个对象现在只有它需要的功能了。任何不同的新共嫩被实现为增加一个组件。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;一个由聚合组件组成的对象系统能有&lt;/span&gt;3&lt;span style="font-family: 宋体;"&gt;种方式实现，可以被看成将胖球对象层次结构转移到一个组合对象上去的不同阶段。下面将介绍一下这&lt;/span&gt;3&lt;span style="font-family: 宋体;"&gt;个阶段。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;对象作为组织胖球&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;一种通常重构胖球对象的方法是将它的功能分散到不同的子对象上去，然后被第一个对象所引用。最终，父系的胖球对象被一系列的指向其他对象的指针代替，最终胖球对象的成员函数编程了这些子对象上函数的接口函数。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;这也许事实上是一个合理的解决方案，如果你的游戏对象里的功能在一个合适小的范围内，或者如果时间是有限的。你可以简单实现任意的对象聚集，通过允许一些子对象为空（通给一个&lt;/span&gt;NULL&lt;span style="font-family: 宋体;"&gt;指针给它们）。假设没有太多的子对象，那么这仍然允许你有一个轻型的没有实现一个管理此对象的组合框架的伪组合对象的优势。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;不足之处是，这仍然在本质上是一个胖球。所有的功能人然被封装在一个大对象里。这不像是你完全的分解胖球对象到纯的子对象那样，所以你仍然遗留了一些重要的开销，仍然会让你轻型的对象变重。你仍然有不断检查所有空指针，以便看看是否需要更新的开销。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;对象作为组件容器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;下一个阶段是分解每个组件（上一节例子里的&amp;#8220;子对象&amp;#8221;）成共享一个公共的基类的对象，因此我们可以存储一个对象的列表在对象里。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;这是一个过度的解决方法，我们仍然有表示游戏实体的根&amp;#8220;对象&amp;#8221;。不管怎样，它应该是一个合理的解决方案，或者确实是在实践中是可行的方案，如果一大部分的代码库中需要这种概念的游戏对象作为具体对象的话。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;你的游戏对象然后变成了一个接口对象，充当了在你游戏里的遗留代码之间桥的作用，并且还是新系统的组合对象。如果时间允许，你最终将会把游戏实体对象作为整体式对象的概念消除掉。相反，访问对象越来越直接的通过它所在的组件了。最终，你能够将其转换到纯聚合了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;对象作为纯聚合&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;在最终的布置图里，一个对象简单是各个部分的和。图&lt;/span&gt;B-2&lt;span style="font-family: 宋体;"&gt;显示了一个方案，每个对象都是由许多不同的组件组成的。这里没有所谓的&amp;#8220;游戏实体对象&amp;#8221;。每一列在图标中都表示同一组件，每一行因此都能表示一个对象。组件自己也可以看成是和组成它们的对象是独立的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://cowboyprogramming.com/images/eyh/Fig-2.gif" alt="" height="478" width="576" /&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="font-family: 宋体;"&gt;图&lt;/span&gt;B-2&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;实践经验&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;我第一个用组件实现的对象的组合系统是我在&lt;/span&gt;Neversoft&lt;span style="font-family: 宋体;"&gt;公司做&lt;/span&gt;Tony Hawk&lt;span style="font-family: 宋体;"&gt;系列游戏的时候做的。我们的游戏对象系统一直伴随着三个连续发布的游戏而发展，指导我们有了一个游戏对象的层次结构来重组我先前提到的胖球反模式。它遭受着所有同样的问题：对象倾向于重量级的。对象有不必要的数据和功能。有时不必要的功能让游戏变慢。功能有时在不同树的分支上重复。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;我在&lt;/span&gt;sweng-gamedev&lt;span style="font-family: 宋体;"&gt;的邮件列表里听说过这个关于&amp;#8220;基于对象的组件&amp;#8221;系统的新式发明。我觉得那听起来是一个好主意。我于是开始重新组织代码，两年以后把它完成了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;为什这么长的时间？因为，首先我们在以每年一个的速度艰苦的做出&lt;/span&gt;&lt;span&gt;Tony Hawk&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;游戏，所以只有很少的时间让我们投入到重构上。第二，我错误的计算了问题的规模。一个三年时间长的代码群已经包含大量的代码。大量的代码一年一年的逐渐变成了某种不灵活的代码。由于代码依赖于游戏对象成为游戏对象，尤其是的某些游戏对象。那说明了有大量的工作要去做，才能使得所有的东西都已组件方式工作。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;预期的阻力&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;我第一遇到的问题就是怎样试着解释这个系统给其他的程序员。如果你不是特别的熟悉对象组合和聚合的事情，那么会被认为是无意的，不必要的复杂，不必要的多余工作，让你受备受打击。程序员已经在传统系统的对象层次结构上工作了很多年，已经非常习惯那种工作方式了。它们甚至变得擅长于那种方式来，能解决那些出现的问题了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;把这个方案卖给经理也是一个困难。你需要能够用平实的语言准确的描述，这个方案怎样能够让游戏完成的更快。下面是一段的因该说的话：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;&amp;#8220;当我们加入新的特性到游戏里时，那会花费很长的时间去完成，将会导致很&lt;/span&gt;BUGS&lt;span style="font-family: 宋体;"&gt;。如果我们采用这种新的组件对象的东西，它能让我们加入新的特性更快，会有更少的&lt;/span&gt;BUGS&lt;span style="font-family: 宋体;"&gt;&amp;#8221;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;而我采用是一种悄悄的方式。我首先和一些程序员单独讨论这个主意，最后说服他们这是一个好主意。我然后实现了通用组件的基本框架，并且还实现了游戏对象功能的很小的一部分作为组件。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;我然后把这些成果呈现给剩下的程序员。他们有一些疑惑和抵触，但是由于它已经实现了并且它在那里工作不是一个大的争议。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;缓慢的进展&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;当框架被链接上了，从静态的层次结构到对象组合的方便性显现的很缓慢。那是一个吃力不讨好的工作，即使你花了很多小时，很多天将代码重构成一些看起来像样的东西，但其和被替换的代码没有什么两样。而且，我们还在做这个事情的时候，我们仍然在为下一个游戏实现新的功能。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;在早些时候，我们撞上了重构我们最大的类&lt;/span&gt;&amp;#8212;&lt;span style="font-family: 宋体;"&gt;滑雪者类的问题。由于它包含有大量的功能，它甚至在一段时间几乎无法重构一小点。事实上，它也无法被重构除非其他在游戏里的对象系统已经服从了组件方式了。话又说回来，其他那些对象系统也不容易被组件化，除非滑雪者已经是一个组件了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;这里的解决方案是创建一个&amp;#8220;胖球组件&amp;#8221;。这是一个单独的巨型组件，封装了大量滑雪者类的功能。少量的其他胖球组件也需要被用在别的地方。我们最终硬是将对象系统塞进了组件里。当这个事情到位了，胖球组件能被逐级的重构成更多的原子组件。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;结果&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;一开始重构的结果不是那么明显。但是随着时间的推移，代码变得越来越清晰并且变得更容易维护，功能都被封装到分散的组件里了。程序员开始用更少的时间创建新类型的对象，仅仅简单的组合一些组件然后再加一个新的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;我们创建了一个数据驱动的对象创建系统，因此整个新类型的对象都能被设计人员创造。这被证明对于快速创建和配置新类型的对象是非常有价值的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;最终程序员开始（以不同的速度）接受组件化系统了。并且他们变得非常熟练的擅长通过组件来增加新的功能了。通用的接口和严格的封装使得&lt;/span&gt;BUGS&lt;span style="font-family: 宋体;"&gt;减少了，代码也更容易阅读，更容易维护和重用。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;实现细节&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;给每一个组件一个通用的接口意味着继承自同一个带虚函数的基类。这会带来额外的开销。但不要因为这一点而使你反对这种方法，节约的开销和对象的简单性相比是不不重要的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;由于每个组件都有一个公共的接口，非常容易的就可以增加额外的调试成员函数给每个组件。这使得增加一个能导出组件的组合对象的可读信息的诊断器对象更容易了。然后，这可以被进化成一个复杂功能的远程调试工具，总能够得到几乎所有类型的游戏对象的最新信息。这也许在传统的层次结构的系统里去实现和维护是十分的令人厌恶的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;理想情况下，组件应该互相不知道到对方。不管怎么样，在现实世界里，总是有特定组件间的依赖关系。性能问题，也决定了组件应该能够快速的访问其他组件。开始的时候，我们让所有组件的引用都是通过组件管理器的，但是当开始时只用了&lt;/span&gt;5%&lt;span style="font-family: 宋体;"&gt;的&lt;/span&gt;CPU&lt;span style="font-family: 宋体;"&gt;时间，我们允许组件存贮指向其他对象的指针，并且直接调用在其他组件里的成员函数。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;在组件里，怎样组合对象的顺序是非常重要的。在我们一开始的系统里，我们把组件作为链表存储在一个容器对象里。每个组件有一个更新函数，每个对象每次迭代组件列表时被调用。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;由于对象创建是数据驱动的，那样会造成麻烦的，如果在链表里的组件不是期望的顺序的话。如果一个对象更新物理相关内容在动画相关内容之前，但是另外一个对象更新动画相关内容在物理相关内容之前，这样他们就会互相失去同步。互相依赖关系像这样的必须找出来，然后在代码里定义强制规则。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;结尾&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 27pt;"&gt;&lt;span style="font-family: 宋体;"&gt;用组件把从胖球风格的对象层次结构转变成组合对象结构是我所做的最好的决定之一。开始的结果是让人失望的，它花费了太多时间去重构现有的代码。不管怎么样，最后的结果是非常值得，轻型的，灵活的，健壮，和可重用的代码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;img src="http://www.cnblogs.com/Henrya2/aggbug/1851717.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Henrya2/archive/2010/10/14/1851717.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/07/19/1780963.html</id><title type="text">[转载]Netmsg 局域网聊天程序</title><summary type="text">作者：钱义力 北京工业大学软件学院 2002 级研 下载源代 码 　　很早就想做一个类似QQ一样的聊天程序，苦于一直没有时间，再加上觉得网络多点通信比较难做，所以这个想法就搁在一旁。最近二个月学校放假闲着无聊看 了一些Tcp/ip,多线程的书，再加上以前的一点C++和VC的基础，就着手做了起来，共化了17天完成了这个程序。它包括服务器端程序 NetMsgServer和客户端程序NetMsgClie...</summary><published>2010-07-19T14:45:00Z</published><updated>2010-07-19T14:45:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/07/19/1780963.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/07/19/1780963.html"/><content type="html">作者：&lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#113;&amp;#121;&amp;#108;&amp;#64;&amp;#101;&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#115;&amp;#46;&amp;#98;&amp;#106;&amp;#117;&amp;#116;&amp;#46;&amp;#101;&amp;#100;&amp;#117;&amp;#46;&amp;#99;&amp;#110;"&gt;钱义力&lt;/a&gt;&lt;br /&gt;       北京工业大学软件学院 2002 级研                 &lt;p&gt;&lt;a href="http://www.vckbase.com/code/downcode.asp?id=2579"&gt;下载源代 码&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;        　　很早就想做一个类似QQ一样的聊天程序，苦于一直没有时间，再加上觉得网络多点通信比较难做，所以这个想法就搁在一旁。最近二个月学校放假闲着无聊看 了一些Tcp/ip,多线程的书，再加上以前的一点C++和VC的基础，就着手做了起来，共化了17天完成了这个程序。它包括服务器端程序 NetMsgServer和客户端程序NetMsgClient。通过编程还发现原始的socket（像send，recv等）命令比VC封装好的 CScoket速度要快。怎么说呢，程序不小，有3000多行的代码，错误和垃圾代码肯定也不少了，毕竟水平有限，大家看了不要扔鸡蛋就谢谢了。&lt;br /&gt;       &lt;br /&gt;       一、说明&lt;br /&gt;       　　本程序采用tcp/ip         socket多线程编程，并对一些重要的同步操作做了超时控制，以减少等待的时间，像连接服务器，等待对方接收文件等。基本功能跟QQ类似，能进行多点的 聊天和点对点的文件传送。这种编程的优势在于传送的数据不会丢失，而且用户上线下线能即时反应出来。唯一的遗憾是界面做的太滥，本人对界面编程一窍不通， 暂且还只能在局域网内使用，因为没有增加可以通过代理服务器的功能。&lt;br /&gt;       &lt;br /&gt;       二、大概通信流程&lt;br /&gt;       &lt;br /&gt;       &lt;img src="http://www.vckbase.com/document/journal/vckbase38/images/netmsgimg.gif" border="0"  alt="" /&gt;&lt;br /&gt;       &lt;br /&gt;       1、NetMsgServer 服务器端&lt;br /&gt;        　　它采用了两个线程，其中一个线程处理各个客户端的连接请求（accept），另一个在客户端请求连接成功后处理接收到的命令并返回信息，包括用户注 册、登陆、下线、生成在线用户列表、查询修改某个在线用户的信息等。&lt;br /&gt;       &lt;br /&gt;       2、NetMsgClient客户端&lt;br /&gt;       　　每个NetMsgClient客户端既是信息服务器端，又是信息客户端，所以能实现多点通信。&lt;br /&gt;       2.1&lt;br /&gt;        　　通过注册来获得用户号码。发送两条命令："REGT\t\n"，再发送一个用户资料的数据结构。注册成功服务器返回一个id号给用户，否则返回一个错 误代码。&lt;/p&gt;       &lt;pre&gt;send(m_dcSocketClient,(char *)&amp;amp;userInf,sizeof(userInf),0)；//发送用户资料&lt;/pre&gt;       &lt;p&gt;其中：&lt;/p&gt;&lt;pre&gt;USER_INF userInf；&lt;br /&gt;//用户信息的结构&lt;br /&gt;typedef struct&lt;br /&gt;{&lt;br /&gt;	long id;&lt;br /&gt;	char nickname[20];&lt;br /&gt;	char sex[10];&lt;br /&gt;	int age;&lt;br /&gt;	char address[50];&lt;br /&gt;	char password[20];&lt;br /&gt;}USER_INF,*LPUSER_INF;      &lt;/pre&gt;       2.2&lt;br /&gt;       　　开启第一个线程登陆服务器，端口是4000。以下1000表示我的id号，发送"USER 1000" 和"PASS        password"命令要求登陆服务器。&lt;br /&gt;       &lt;br /&gt;       2.3&lt;br /&gt;       　　如果登陆成功，就发送"LIST \t\n"命令到服务器端，取得在线用户的列表，并显示在列表框内。在线列表以结构数组的形势传送。&lt;pre&gt;recv(m_dcSocketClient,(char *)(m_onlineUser),sizeof(m_onlineUser),0)；&lt;/pre&gt;       &lt;p&gt;其中：       &lt;/p&gt;&lt;pre&gt;ONLINEUSER_INF m_onlineUser[MAX_ONLINE_NUM]; //在线用户数组&lt;br /&gt;typedef struct&lt;br /&gt;{&lt;br /&gt;	long id;&lt;br /&gt;	char nickname[20];&lt;br /&gt;	char ip[16];&lt;br /&gt;	SOCKET s; &lt;br /&gt;}ONLINEUSER_INF,*LPONLINEUSER_INF;      &lt;/pre&gt;       2.4&lt;br /&gt;       　　然后开启第二个线程创建消息服务器端，接受各个客户端的连接请求，端口是4001。       &lt;pre&gt;while(TRUE)&lt;br /&gt;{&lt;br /&gt;	int sockLen=sizeof(inetAddr);&lt;br /&gt;	if((sAccept=accept(sListen,(SOCKADDR*)&amp;amp;inetAddr,&amp;amp;sockLen))==INVA  LID_SOCKET)&lt;br /&gt;	{&lt;br /&gt;		AfxMessageBox("错误:accept failed in threadMsg");&lt;br /&gt;		return 1;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	AfxBeginThread(threadRecvMsgServer,(LPVOID)sAccept);			&lt;br /&gt;}      &lt;/pre&gt;       2.5&lt;br /&gt;       　　如果接收到连接就开启第三个线程接受对方的信息。&lt;pre&gt;recv(acceptSocket,buff,sizeof(buff),0)&lt;/pre&gt;       &lt;p&gt;假如我是1000这个用户，接受到"chat        1001\t\n"指令，说明是1001这个用户想和我聊天，如果我的聊天人数太多就拒绝1001的聊天请求。&lt;/p&gt;       &lt;pre&gt;sprintf(buff,"%d\t\n",REJECT_CHAT_REQ);send(acceptSocket,buff,sizeof(buff),0);&lt;/pre&gt;       &lt;p&gt;如果接受他的请求，就发送确认信息。&lt;/p&gt;       &lt;pre&gt;sprintf(buff,"%d\t\n",ACCEPT_CHAT_REQ);send(acceptSocket,buff,sizeof(buff),0);&lt;/pre&gt;       接下来就可以通信了。&lt;br /&gt;       &lt;br /&gt;       2.6&lt;br /&gt;        　　如果双方还要求传送文件，就开启第4个线程，端口是4002，只是点对点的通信，如果1000想法送文件给1001，文件发送方建立文件服务器端，然 后由消息通讯线路（即上面的acceptSocket）发送"File         anc.avi\t\n"命令到对方消息通讯线路上，让1001连接1000的file文件服务器。1001连接到1000的file服务器上后，发送确 认命令决定是不是接收文件，如果接收就可以开始传送文件。&lt;br /&gt;       &lt;br /&gt;       2.7&lt;br /&gt;       　　假定我是1000这个用户，1001已经连接到我的机器，并和我聊天，这时如果我还想和1002聊天，就开启第5个线程发送"chat         1000\t\n"到1002的信息服务器端（端口4001，每个netmsg客户端都有信息服务器端），如果还想和1003聊天，就开启第6个线程发送 命令"chat        1000\t\n"到1003的信息服务器端请求连接，这样每个客户端都可以实现多点通讯。&lt;br /&gt;       &lt;br /&gt;       QQ：54476167&lt;img src="http://www.cnblogs.com/Henrya2/aggbug/1780963.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Henrya2/archive/2010/07/19/1780963.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/07/19/1780855.html</id><title type="text">[转载]使用 WSAAsyncSelect 的 Winsock 编程模型</title><summary type="text">http://linode.codingnow.com/cgi-bin/mt/mt-tb.cgi/213 前段时间思考了 Windows 下应用程序最合适的实现模型。写了这么一篇  blog 在  Windows 下使用 Timer 驱动游戏 。  我想，Windows 有 Windows 的哲学，Windows 平台下的应用程序，也有他的理念。关于 Windows  编程的书，我比较喜欢 Cha...</summary><published>2010-07-19T10:18:00Z</published><updated>2010-07-19T10:18:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/07/19/1780855.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/07/19/1780855.html"/><content type="html">&lt;p&gt;&lt;a title="http://linode.codingnow.com/cgi-bin/mt/mt-tb.cgi/213" href="http://linode.codingnow.com/cgi-bin/mt/mt-tb.cgi/213"&gt;http://linode.codingnow.com/cgi-bin/mt/mt-tb.cgi/213&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;                            &lt;div&gt;                               &lt;p&gt;前段时间思考了 Windows 下应用程序最合适的实现模型。写了这么一篇  blog &lt;a href="http://blog.codingnow.com/2006/12/main_loop_windows_timer.html"&gt;在  Windows 下使用 Timer 驱动游戏&lt;/a&gt; 。&lt;/p&gt;  &lt;p&gt;我想，Windows 有 Windows 的哲学，Windows 平台下的应用程序，也有他的理念。关于 Windows  编程的书，我比较喜欢 Charles Petzold 的那本：《&lt;a href="http://www.douban.com/subject/1088168"&gt;Windows 程序设计&lt;/a&gt;》（还有另一本是《&lt;a href="http://www.douban.com/subject/1088045/"&gt;WIndows 核心编程&lt;/a&gt;》，在第 5 版的  3.2 节中就提到 Windows 编程的难点在于&amp;#8220;别调用我，我会调用您&amp;#8221;以及&amp;#8220;行动迅速&amp;#8221;。&lt;/p&gt;  &lt;p&gt;以前，我不十分理解 Windows 为什么把大量的任务放在消息循环中被动的调用，慢慢的我有点理解了。这就是 Windows 。&lt;/p&gt;  &lt;p&gt;网络编程我一直是顺着 BSD socket 来学习和使用的，所以 Windows 下写 winsock  程序也一直没有改变习惯。这两天突然对这个做了下反思，按照 Windows 的理念来写 socket 程序应该是怎样的形式？查了下 msdn  后，发现了一个以前被我忽略掉的 api &amp;#8212;&amp;#8212; WSAAsyncSelect 。&lt;/p&gt;  &lt;p&gt;以前粗读 mfc 的源码时，仿佛见过 CSocket  用这个来实现。当时没有太在意；也听不同的几个朋友跟我简单介绍过它，同样没有放在心上。直到今天，自己突然有兴趣了，才仔细研究了一下。&lt;/p&gt;                             &lt;/div&gt;                            &lt;div id="more"&gt;                               &lt;p&gt;从今天的眼光来看，winsock 并不是一个很好的设计。在 tcp/ip  已经一统天下来看，winsock 的许多设计是蹩脚且多余的。不过，当我们把自己代入 winsock 设计的那个年代，再结合 windows  自己的理念来看。就会发现许多合理之处。&lt;/p&gt;  &lt;p&gt;WSAAsyncSelect 就是提供了一个最适合 Windows 自己运作模型的工作方式。它可以把 socket  的消息映射到线程的消息循环中。这符合：&amp;#8220;别调用我，我会调用您&amp;#8221;的 Windows 哲学。&lt;/p&gt;  &lt;p&gt;具体的用法是多说无益，&lt;a href="http://msdn.microsoft.com/library/en-us/winsock/winsock/wsaasyncselect_2.asp?frame=true"&gt;msdn  已经讲的很清楚了&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;通过 WSAAsyncSelect  设置，线程消息循环将在指定的事件发生后，得到相应的消息。WSAGETSELECTEVENT(lParam) 可以用来得到网络事件本身，而  wParam 则被用来传递 socket 的 handle 。然后，就可以主动调用 socket 函数来处理这些事件了。我觉得这比 select  的模型更适合 Windows 应用程序。&lt;/p&gt;  &lt;p&gt;而 windows 的应用程序的主体永远只需要一个简单的循环来处理和分发消息就够了。&lt;/p&gt;  &lt;p&gt;今天我本想 google 一下，看有没有专门讲解 windows 网络编程的书。发现只有一本《&lt;a href="http://www.douban.com/subject/1229925/"&gt;Windows网络编程技术&lt;/a&gt;》，读了一下  china-pub 上的书评后，倒了胃口，便不想买了，还是读 msdn 吧。&lt;/p&gt;                             &lt;/div&gt;                         &lt;/div&gt;&lt;img src="http://www.cnblogs.com/Henrya2/aggbug/1780855.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Henrya2/archive/2010/07/19/1780855.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/07/14/1777598.html</id><title type="text">[转载]Singleton的一个基类实现</title><summary type="text">今天去面试一家游戏公司，笔试题有道叫做 设计并实现一个Singleton基类。以前没有认真考虑过这个问题，转载了一篇。原文地址：http://blog.csdn.net/Blue_Light/archive/2008/07/13/2646266.aspx 在创建型模式中，有一种设计模式&amp;#8220;Singleton&amp;#8221;。该模式的意图是，保证一个类仅有一个实例，并提供一个访问它的全局访问...</summary><published>2010-07-14T14:05:00Z</published><updated>2010-07-14T14:05:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/07/14/1777598.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/07/14/1777598.html"/><content type="html">&lt;p&gt;今天去面试一家游戏公司，笔试题有道叫做 设计并实现一个Singleton基类。以前没有认真考虑过这个问题，转载了一篇。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a target="_blank" title="http://blog.csdn.net/Blue_Light/archive/2008/07/13/2646266.aspx" href="http://blog.csdn.net/Blue_Light/archive/2008/07/13/2646266.aspx"&gt;http://blog.csdn.net/Blue_Light/archive/2008/07/13/2646266.aspx &lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在创建型模式中，有一种设计模式&amp;#8220;Singleton&amp;#8221;。该模式的意图是，保证一个类仅有一个实例，并提供一个访问它的全局访问点。在GOF的指导下，我 们经常写一些Singleton类。每个类很类似。 &lt;/p&gt;&lt;p&gt;以下代码描述了一个Singleton的基类及使用方法：&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;template&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt; &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;  T&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;class&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt; AllocUsingNew &lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;public&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt;  T* Create()&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;  &lt;span style="color: blue;"&gt;new&lt;/span&gt; T;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt;  &lt;span style="color: blue;"&gt;void&lt;/span&gt; Destroy(T *p)&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;delete&lt;/span&gt;  p;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;};&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;template&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt; &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;  T&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;class&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt; AllocUsingStatic &lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;public&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt;  T* Create()&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt;  T t;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;  &lt;span style="color: blue;"&gt;new&lt;/span&gt; (&amp;amp;t)T;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt;  &lt;span style="color: blue;"&gt;void&lt;/span&gt; Destroy(T *p)&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p-&amp;gt;~T();&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;};&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;template&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt; &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;  T,&lt;span style="color: blue;"&gt;template&lt;/span&gt; &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt;  AllocPolicy = AllocUsingStatic&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;class&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt; Singleton&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;public&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt;  T* Instance()&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;  (NULL == m_pThis)&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pThis =  AllocPolicy&amp;lt;T&amp;gt;::Create();&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assert(m_pThis);&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pThis-&amp;gt;Initialize();&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;  m_pThis;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt;  &lt;span style="color: blue;"&gt;void&lt;/span&gt; Destroy()&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;  (m_pThis)&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pThis-&amp;gt;Finalize();&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AllocPolicy&amp;lt;T&amp;gt;::Destroy(m_pThis);&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_pThis = NULL;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt;  Initialize()&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt;  Finalize()&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;protected&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Singleton(){}&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~Singleton(){}&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;private&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Singleton(&lt;span style="color: blue;"&gt;const&lt;/span&gt; Singleton&amp;amp;);&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Singleton&amp;amp; &lt;span style="color: blue;"&gt;operator&lt;/span&gt; = (&lt;span style="color: blue;"&gt;const&lt;/span&gt;  Singleton&amp;amp;);&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;friend&lt;/span&gt;  &lt;span style="color: blue;"&gt;class&lt;/span&gt; AllocPolicy&amp;lt;T&amp;gt;;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;private&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;static&lt;/span&gt;  T * m_pThis;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;};&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;template&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt; &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;  T,&lt;span style="color: blue;"&gt;template&lt;/span&gt; &amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt;  AllocPolicy&amp;gt; &lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;T* Singleton&amp;lt;T,AllocPolicy&amp;gt;::m_pThis = NULL;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;class&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt; MySingleton : &lt;span style="color: blue;"&gt;public&lt;/span&gt; Singleton&amp;lt;MySingleton,AllocUsingNew&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;public&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt;  SetValue(&lt;span style="color: blue;"&gt;int&lt;/span&gt; value)&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_value = value;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt;  print()&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; m_value &amp;lt;&amp;lt;  endl;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt;  Initialize()&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_value = 1000;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;private&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt;  m_value;&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;};&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; color: blue; font-family: 新宋体;"&gt;int&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt; _tmain(&lt;span style="color: blue;"&gt;int&lt;/span&gt; argc,  _TCHAR* argv[])&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;{&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MySingleton::Instance()-&amp;gt;print();&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MySingleton::Destroy();&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; system("pause");&lt;/span&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;/p&gt; &lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;  0;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 12pt; font-family: 新宋体;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Henrya2/aggbug/1777598.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Henrya2/archive/2010/07/14/1777598.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/07/03/1770671.html</id><title type="text">[转载] VC6 STLport-5.1.4 /STLport-4.6.2 编译，安装</title><summary type="text">VC6 STLport-5.1.4 编译，安装 1. 开启命令行窗口，建立VC环境，执行 %MSVCDir%\VC98\Bin\VCVARS32.BAT2. 切换到  %STLport-5.1.4%\build\lib，执行 configure -c msvc6 -clean, 进行编译配置。其中：  -c选择编译器 -clean完成后清除 build configuration files更多选...</summary><published>2010-07-03T14:25:00Z</published><updated>2010-07-03T14:25:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/07/03/1770671.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/07/03/1770671.html"/><content type="html">&lt;p&gt;VC6 STLport-5.1.4 编译，安装&lt;/p&gt; &lt;p&gt;1. 开启命令行窗口，建立VC环境，&amp;nbsp;执行 %MSVCDir%\VC98\Bin\VCVARS32.BAT&lt;br /&gt;2. 切换到  %STLport-5.1.4%\build\lib，执行 configure -c msvc6 -clean, 进行编译配置。其中：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  -c&amp;nbsp;选择编译器&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;-clean&amp;nbsp;完成后清除 build configuration files&lt;br /&gt;&amp;nbsp;更多选项参数使用命令  configure --help 查看&lt;br /&gt;3. 执行 nmake /fmsvc.mak 或者 nmake /fmsvc.mak  install，后者在编译完成后拷贝生成的library至%STLport-5.1.4%\lib目录下。建议使用 install 参数。&lt;br /&gt;4.  打开VC6，在Tools-&amp;gt;Options-&amp;gt;Directories中，添加include  files路径：%STLport-5.1.4%\stlport，添加library  files路径：%STLport-5.1.4%\lib，调整这两个添加的路径至第一路径位置。&lt;br /&gt;5.  修改工程选项：Project-&amp;gt;Settings...-&amp;gt;C/C++中，Category选择Code  Generation，然后在use run-time library中选择Debug  Multithreaded。（如果是release版本，选择Multithreaded；如果想用动态链接，则要先编译动态链接版本的 STLport，再在这儿选择相应的DLL）&lt;/p&gt;  &lt;p&gt;VC6 STLport-4.6.2 编译，安装【%STLport-4.6.2% 表示 其路径，比如 C:\STLPORT 等】&lt;br /&gt;1.  /*****&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.修改....\VC98\Bin中的VCVARS32.BAT文件，找到&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set  INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB% &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  这两句，加上STLPort的路径，修改成如下：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set  INCLUDE=%STLport-4.6.2%\stlport;%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  set LIB=%STLport-4.6.2%\lib;%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB% &lt;br /&gt;&amp;nbsp;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (C:\STLport\lib目前还不存在，但不用着急，编译完stlport就有了)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ****/&lt;/p&gt; &lt;p&gt;2. 开启命令行窗口，建立VC环境，&amp;nbsp;执行 %Microsoft Visual Studio%\VC98\Bin\VCVARS32.BAT&lt;br /&gt;3.  nmake -f vc6.mak clean all&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (vc6还可以选择支持unicode的vc6-unicode.mak文件)&lt;br /&gt;4.  配置VC：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 点击vc的tools-options-Directories,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;选择Include  files，加入%STLport-4.6.2%\STLPORT，并调到最前面&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;选择Library  files，加入%STLport-4.6.2%\LIB，并调到最前面&amp;nbsp;&lt;/p&gt;  &lt;p&gt;---------------------------------------------------------------------&lt;/p&gt; &lt;p&gt;VC6(SP6)+STLPort4.6.2安装全攻略&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;首先，我对VC/c++几乎没有经验，STL也是刚开始学。为了用stlport，瞎忙呼了大半天，也是刚刚装好。为了避免自己或者别人安 装stlport时再走弯路，特记录下这段经历。由于我很菜，即使安装完毕，仍有很多不明之处，所以下面的文档如果有错误，请您批评指出。文中还有一些疑 问，希望学深入之后自己能解答，也欢迎网友帮我解答。&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;step by step, Now:&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;1.安装VC6，打补丁sp6 &lt;br /&gt;&amp;nbsp;(下载地址&lt;a target="_blank" href="http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp6/default.aspx"&gt;http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp6/default.aspx&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;2.推荐安装一个visual assist for VC6，这是个好东东。它使得编辑环境更加好用。&lt;br /&gt;&amp;nbsp; (有个下载地址&lt;a target="_blank" href="http://www.vcer.net/download.jsp?id=1042"&gt;http://www.vcer.net/download.jsp?id=1042&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;a target="_blank" href="http://www.vcer.net/upload/2004/04/1042.zip"&gt;http://www.vcer.net/upload/2004/04/1042.zip&lt;/a&gt;  不知道失效没有)&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;3.到&lt;a target="_blank" href="http://www.stlport.org/"&gt;www.stlport.org&lt;/a&gt;下载STLPort。我下载 的是stlport4.6.2&lt;br /&gt;&amp;nbsp; (&lt;a target="_blank" href="http://www.stlport.org/archive/STLport-4.6.2.tar.gz"&gt;http://www.stlport.org/archive/STLport-4.6.2.tar.gz&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;4.未使用stlport之前，先看看VC的stl库的表现。&lt;br /&gt;&amp;nbsp; 作一个最简单的工程，编一个cpp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #include &amp;lt;vector&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using namespace std;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  int main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector&amp;lt;int&amp;gt; v;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  v.push_back(0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;  这个程序编译能通过，把鼠标放到vector和push_back上，右键到其定义处(goto the Definition of  ...)，在弹出的窗口，（注意到这些定义中std是&lt;strong&gt;小写&lt;/strong&gt;的字串)。选中一个进入定义文件，可以看出引用的 是....\VC98\Include\VECTOR文件。这个目录下还有LIST等等，这是VC6自带的STL实现。据说比较烂，没用过我不了解:) &lt;br /&gt;&amp;nbsp;&amp;nbsp;  &lt;br /&gt;&amp;nbsp;&amp;nbsp; 但是下面这个程序就编译不过了。&lt;br /&gt;&amp;nbsp;#include  &amp;lt;vector&amp;gt;&lt;br /&gt;&amp;nbsp;#include &amp;lt;deque&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;using namespace std;&lt;br /&gt;&amp;nbsp;int  main()&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; const int arraySize = 7;&lt;br /&gt;&amp;nbsp; int ia[arraySize] = {0,  1, 2, 3, 4, 5, 6};&lt;br /&gt;&amp;nbsp; vector&amp;lt;int&amp;gt; v(ia, ia+arraySize);&lt;br /&gt;&amp;nbsp;  //v.push_back(0);&lt;br /&gt;&amp;nbsp; deque&amp;lt;int&amp;gt; d(ia, ia+arraySize);&lt;br /&gt;&amp;nbsp; return  0;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;原因应该是VC6的deque不支持这样的构造吧。但是这个程序在用gcc的Dev-c++下编译就没有问 题。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;好了，保存我们的工程，可以猜想，如果stlport安装成功之后，应该是可以顺利编译的。&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;5.把下载的stlport压缩包解压，我假设解压到&lt;strong&gt;C:\STLport&lt;/strong&gt;（紧挨着C:\STLport的子目 录是stlport的src,doc,stlport等目录）&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;6.编译stlport&lt;br /&gt;&amp;nbsp; (1) 设置环境变量，使得环境变量PATH中包含C:\Program Files\Microsoft  Visual Studio\VC98\Bin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (当然也可以不设置，如果你愿意不厌其烦地打这个目录名)&lt;br /&gt;&amp;nbsp; (2)  打开一个dos窗口（运行cmd）&lt;br /&gt;&amp;nbsp; (3)&amp;nbsp; 运行 ....\VC98\Bin中的VCVARS32.BAT：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*****&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.修改....\VC98\Bin中的VCVARS32.BAT文件，找到&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  set  INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB% &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  这两句，加上STLPort的路径，修改成如下：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set  INCLUDE=C:\STLport\stlport;%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  set LIB=C:\STLport\lib;%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB% &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  (C:\STLport\lib目前还不存在，但不用着急，编译完stlport就有了)&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  注意：第(3)-a步骤修改VCVARS32.BAT这个文件的内容完全没有必要，我是看某些文档上这么写的，但后来试了几次，改不改这个文件都没有关 系！所以不改算了。（这步骤注销！）&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ****/&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  b.在dos窗口中运行....\VC98\Bin下这个文件&lt;strong&gt;VCVARS32.BAT&lt;/strong&gt;&amp;nbsp; （必须！！！）&lt;br /&gt;&amp;nbsp;  &lt;br /&gt;&amp;nbsp; (4) 在同一个dos窗口中！进入C:\STLport\src目录运行&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;nmake -f  vc6.mak clean all&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  (问题，vc6还可以选择支持unicode的vc6-unicode.mak文件，但vc中unicode如何用，我还不了解:( )&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  编译需要一点时间，完成之后，你可以选择运行 nmake -f vc6.mak install。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  注:install任务是可选的，看stlport的INSTALL文档：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;em&gt; [quote]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  "install" target works on most platforms.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; On Win32, it does the  following :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - copies STLport headers in "stlport" subdirectory  of your compiler's INCLUDE directory;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - copies STLport .lib  files in your compiler's LIB directory;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - copies STLport DLLs  to Windows system directory so they can be found at runtime.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  [/quote]&lt;br /&gt;&lt;/em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dums（stlport论坛上的高手）建议一般不要用nmake  install，我也强烈建议不要运行这个nmake  install！！！如果你想vc的stl和STLPort的stl共存，那么这个install任务就更加不要执行！！！&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  (如果你还是要运行nmake install，并且运行有错误，则再运行一次VCVARS32.BAT先)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 问题：有个安装文档中写到完成之后要修改C:\Program  Files\Microsoft Visual  Studio\Common\MSDev98\Bin\SYSINCL.DAT，我没有试，怎么修改？有什么用？&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; **/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;br /&gt;7.配置vc&lt;br /&gt;&amp;nbsp;&amp;nbsp; 进入VC，编译前面那个有错的cpp，发现还是有同样的编译错误。&lt;br /&gt;&amp;nbsp;&amp;nbsp;  （即使修改了VCVARS32.BAT，加上stlport的路径，也没有用！似乎这个文件不能把include和lib加入。这也是我说为什么不用修改 VCVARS32.BAT的原因，不明白这个文件在运行vc时的作用，请您指正:) )&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;  点击vc的tools-options-Directories,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;选择Include  files，加入C:\STLPORT\STLPORT，并调到最前面&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 选择Library  files，加入C:\STLPORT\LIB，并调到最前面&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;  编译工程，呵呵，应该通过了吧。同样的，为了验证我们用的是stlport的STL库，把鼠标放到程序中vector和push_back上，右键到其定 义处(goto the Definition of ...)，在弹出的窗口，（注意到这些定义中STL是&lt;strong&gt;大写&lt;/strong&gt;的字 串了)。选中一个进入定义文件，可以看出引用的是C:\STLport\stlport\stl\_vector.h了。&lt;br /&gt;&amp;nbsp;&amp;nbsp;  (如果有问题，试着Build-Clean清除掉缓存)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; 引申：&lt;br /&gt;&amp;nbsp;&amp;nbsp;  现在只是能基本的使用stlport，unicode版本的编译没有试。另外stlport本身也有较复杂的配置，能进行优化，静态链接等配置。我还没用 到那个程度，不过有点提示，如果想进行配置，请看STLport的config文件 (&lt;strong&gt;stlport/stl_user_config.h  和 stlport/stl/_site_config.h&lt;/strong&gt;)其中的注释告诉我们怎么作。&lt;img src="http://www.cnblogs.com/Henrya2/aggbug/1770671.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Henrya2/archive/2010/07/03/1770671.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/05/10/1731768.html</id><title type="text">[转载] 跨平台C++程序开发系列文章</title><summary type="text">/***********************************************************************************  作者：祝飞* 邮件：zhufei@wawton.com*  MSN： zhufei@wawton.com* 出处：http://zhufei1980.spaces.live.com/blog/cns!131FD0729BCEF2...</summary><published>2010-05-10T07:16:00Z</published><updated>2010-05-10T07:16:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/05/10/1731768.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/05/10/1731768.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;p&gt;/*&lt;br /&gt;&amp;nbsp;********************************************************************************&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*  作者：祝飞&lt;br /&gt;&amp;nbsp;* 邮件：&lt;a target="_blank" href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#122;&amp;#104;&amp;#117;&amp;#102;&amp;#101;&amp;#105;&amp;#64;&amp;#119;&amp;#97;&amp;#119;&amp;#116;&amp;#111;&amp;#110;&amp;#46;&amp;#99;&amp;#111;&amp;#109;"&gt;zhufei@wawton.com&lt;/a&gt;&lt;br /&gt;&amp;nbsp;*  MSN： &lt;a target="_blank" href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#122;&amp;#104;&amp;#117;&amp;#102;&amp;#101;&amp;#105;&amp;#64;&amp;#119;&amp;#97;&amp;#119;&amp;#116;&amp;#111;&amp;#110;&amp;#46;&amp;#99;&amp;#111;&amp;#109;"&gt;zhufei@wawton.com&lt;/a&gt;&lt;br /&gt;&amp;nbsp;* 出处：&lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21121.entry"&gt;http://zhufei1980.spaces.live.com/blog/cns!131FD0729BCEF27B!121.entry&lt;/a&gt;&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*  本系列文章采用类BSD协议发布：&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 无论修改与否，你都可以进行任何目的的转发，甚至于直接销售，只需要满足以下条件：&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  1. 包含作者信息（作者、邮件、MSN、出处、协议）&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. 未获得授权情况下，请勿使用作者信息进行任何目的的推广活动&lt;br /&gt;&amp;nbsp;*  违反协议的情况下，作者保留所有权利。&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;********************************************************************************&lt;br /&gt;&amp;nbsp;*/&lt;/p&gt; &lt;p&gt;总概&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 跨平台C++程序开发，顾名思义，一份相同的代码，在不同的平台编译，在不同的平台运行。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  所谓的跨平台，一般意义上指Windows和Unix-like平台；&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  需要跨平台的程序，一般从Unix-like平台跨越到Windows平台，需要更多平台的展示及更低廉的解决方案；&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  而从计算机的方展史来看，先有Unix-like系统，后有Windows平台，Windows平台的许多系统接口参考了Unix-like系统接口；&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  所以，现有的跨平台解决方案，一般都偏向Unix接口；&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要进行跨平台开发，建议先打好Unix-like系统的C/C++编程基础。&lt;/p&gt; &lt;p&gt;&lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21120.entry"&gt;C++ 循序渐进学习之书籍推荐&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;目录&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.&amp;nbsp; &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21122.entry"&gt;跨 平台C++程序开发系列之一 开发工具选择&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.&amp;nbsp; &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21123.entry"&gt;跨 平台C++程序开发系列之二 MPC多平台编译工程文件生成工具，附实例&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.&amp;nbsp; &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21124.entry"&gt;跨 平台C++程序开发系列之三 CppUnit自动测试工具，附实例&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4.&amp;nbsp; &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21125.entry"&gt;跨 平台C++程序开发系列之四 Doxygen接口文档生成，附实例&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5.&amp;nbsp; &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21126.entry"&gt;跨 平台C++程序开发系列之五 ACE跨平台工具库引介&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.&amp;nbsp; &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21127.entry"&gt;跨 平台C++程序开发系列之六 DLL/so动态库开发基础，附实例&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7.&amp;nbsp; &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21128.entry"&gt;跨 平台C++程序开发系列之七 DLL/so动态库开发进阶，附实例&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8.&amp;nbsp; &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21129.entry"&gt;跨 平台C++程序开发系列之八 DLL/so动态库开发高阶之COM_CORBA本质，附实例&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9.&amp;nbsp; &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21130.entry"&gt;跨 平台C++程序开发系列之九 多厂家支持数据库操作接口&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10. &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21131.entry"&gt;跨 平台C++程序开发系列之十 GUI开发工具的选择&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11. &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21132.entry"&gt;跨 平台C++程序开发系列之十一 C与C++的选择与平衡&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12. &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21133.entry"&gt;跨 平台C++程序开发系列之十二 基于管理和预分配池的多进程多线程服务器端程序方案&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13. &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21134.entry"&gt;跨 平台C++程序开发系列之十三 开发架构模式的选择，CMM与XP的混合&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 14. &lt;a target="_blank" href="http://zhufei1980.spaces.live.com/blog/cns%21131FD0729BCEF27B%21135.entry"&gt;跨 平台C++程序开发系列之十四 解放思想，选择适合自己的开发之路&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;以上转载的文章仅供参考，我认为有不少&amp;#8220;偏见&amp;#8221;，要怎么走还是要看自己选择和现实的情况。 &lt;br /&gt;&lt;/p&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Henrya2/aggbug/1731768.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Henrya2/archive/2010/05/10/1731768.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/03/21/1690849.html</id><title type="text">计算机科学数学理论浅谈 (转载）</title><summary type="text">【来源：ＴＳＴＣ文档中心】 　　计算机自从其诞生之日起，它的主要任务就是进行各种各样的科学计算。文档处理，数据处理，图像处理，硬件设计， 软件设计等等，都可以抽象为两大类：数值计算与非数值计算。作为研究计算机科学技术的人员，我们大都对计算数学对整个计算机科学的重要性有一些了解。但是 数学对我们这些专业的研究和应用人员究竟有多大的用处呢？我们先来看一下下面的一个流程图： 上图揭示了利用计算机解决科学...</summary><published>2010-03-21T02:28:00Z</published><updated>2010-03-21T02:28:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/03/21/1690849.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/03/21/1690849.html"/><content type="html">&lt;p&gt;【来源：ＴＳＴＣ文档中心】&lt;/p&gt; &lt;p&gt;计算机自从其诞生之日起，它的主要任务就是进行各种各样的科学计算。文档处理，数据处理，图像处理，硬件设计， 软件设计等等，都可以抽象为两大类：数值计算与非数值计算。作为研究计算机科学技术的人员，我们大都对计算数学对整个计算机科学的重要性有一些了解。但是 数学对我们这些专业的研究和应用人员究竟有多大的用处呢？我们先来看一下下面的一个流程图：&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;center&gt; &lt;p&gt;&lt;img style="width: 547px; height: 177px;" src="http://www.examlink.com/articles/images/others/04_07_23_02/image001.gif" alt="" height="157" width="420" /&gt; &lt;/p&gt;&lt;/center&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;上图揭示了利用计算机解决科学计算的步骤，实际问题转换为程序，要经过一个对问题抽象的过 程，建立起完善的数学模型，只有这样，我们才能建立一个设计良好的程序。从中我们不难看出计算数学理论对用计算机解决问题的重要性。下面我们将逐步展开对 这个问题的讨论。&lt;/p&gt; &lt;p&gt;计算机科学的数学理论体系是相当庞杂的，笔者不敢随意划分，参考计算机科学理论的学科体系，我们谈及的问题 主要涉及：数值计算，离散数学，数论，计算理论四大方向。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;[一]数值计算&lt;/strong&gt;（Numerical  Computation）主要包括数值分析学、数学分析学、线性代数、计算几何学、概率论与数理统计学。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;数值分析学&lt;/strong&gt;又常被称为计算方法学，是计算理论数学非常重要的一个分支，主要研究数值型计算。 研究的内容中首先要谈谈数值计算的误差分析，误差是衡量我们的计算有效与否的标准，我们的算法解决问题如果在误差允许的范围内，则算法是有效的，否则就是 一个无效的问题求解。另外就是数值逼近，它研究关于如何使用容易数值计算的函数来近似地代替任意函数的方法与过程。感觉应用比较广的不得不提切雪比夫逼近 和平方逼近了。笔者曾经尝试过的就是通过最佳平方逼近进行曲线的拟合，开发工具可以选择VC++或者Matlab。插值函数是另外一个非常重要的方面，现 代的计算机程序控制加工机械零件，根据设计可给出零件外形曲线的某些型值点，加工时走刀方向及步数，就要通过插值函数计算零件外形曲线及其他点函数值。至 于方程求根、线性方程组求解，一般的计算性程序设计问题都会多多少少的涉及一些，我们这里就不赘述了。关于数值分析学的一个学习误区就是仅仅学习理论知 识，而很难和程序设计结合起来，实际上通过上面的论述，大家已经能够初步地认识到这个学科是应当与程序设计紧密联系才能够体现它的重要性的。关于理论的学 习，推荐华中科技大学李庆扬老师的《数值分析》。然而理论学习毕竟是个过程，最终的目标还是要用于程序设计解决实际的计算问题，向这个方向努力的书籍还是 挺多的，这里推荐大家高等教育出版社（CHEP）和施普林格出版社(Springer)联合出版的《计算方法（Computational  Methods）》,华中理工大学数学系写的（现华中科技大学），这方面华科大做的工作在国内应算是比较多的，而个人认为以这本最好，至少程序设计方面涉 及了：任意数学函数的求值，方程求根，线性方程组求解，插值方法，数值积分，场微分方程数值求解。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;数学分析学&lt;/strong&gt;很多学校在近些年已经替代高等数学被安排到了本科教学当中。原因是很简单的，高等 数学虽然也是非常有用的工程数学，介绍的问题方法也被广泛的应用，但是正如大家所知道的，高等数学不太严格的说，基本上就是偏向于计算的数学分析，当然省 去了数学分析非常看重的推理证明，然而我们认为这一部分正是我们最需要的。这对我们培养良好的分析能力和推理能力极有帮助。我的软件工程学导师北工大数理 学院的王仪华先生就曾经教导过我们，数学系的学生到软件企业中大多作软件设计与分析工作，而计算机系的学生做初级程序员的居多，原因就在于数学系的学生分 析推理能力，从所受训练的角度上要远远在我们平均水平之上。谈到这方面的书籍，公认北京大学张筑生老师的《数学分析新讲》为最好。张筑生教授一生写的书并 不太多，但是只要是写出来的每一本都是本领域内的杰作，这本当然更显突出些。这种老书看起来不仅是在传授你知识，而是在让你体会科学的方法与对事物的认识 方法。现在多用的似乎是复旦大学的《数学分析》，高等教育出版社的，也是很好的教材。但关于如何去利用从中获得的推理证明能力，我们在遇到具体问题的时 候，可以在今后的文章详细讨论。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;线性代数&lt;/strong&gt;是我们在工科本科学习的必修课程，似乎大家找不到到底这个有什么用，其实很明显，线 性代数作为工程数学的重要分支，在计算机领域的研究有相当广泛的应用。最为突出的可以谈谈数组和矩阵的相关知识：&lt;br /&gt;&lt;br /&gt;下面谈一个我经常作为例 子和同学讨论的问题：四个城市之间的航线如图所示：&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;center&gt; &lt;p&gt;&lt;img src="http://www.examlink.com/articles/images/others/04_07_23_02/image002.gif" alt="" height="159" width="148" /&gt; &lt;/p&gt;&lt;/center&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;令aij=1,表示从i市到j市有1条航线&lt;br /&gt;令aij=0，表示从i市到j市没有单项航线&lt;br /&gt;则 图可用矩阵表示：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;A= (aij) = &lt;img src="http://www.examlink.com/articles/images/others/04_07_23_02/image003.gif" alt="" align="center" height="96" width="52" /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们可以采用程序设计实现这个问题，如果辅以 权值，可以转化为最短路径的问题，再复杂化一点还可以转化为具有障碍物的最短路径问题，这就会涉及一些如Dijkstra算法等高级程序设计算法话题。这 些都依靠着数组、矩阵的基本知识。数组的应用主要在图像处理以及一些程序设计理论。矩阵的运算领域极为广泛，比如在计算机图形学当中曲线曲面的构造，图像 的几何变换，包括平移、镜像、转置、缩放。在高级图像问题更有广泛应用，例如在图像增强技术，投影技术中的应用。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;计算几何学&lt;/strong&gt;研究的是几何外形信息的计算机表示。包括几何查找、多边形、凸包问题、交与并、几 何体的排列、几何拓扑网络设计、随机几何算法与并行几何算法。它构成了计算机图形学中的基本算法，是动画设计，制造业计算机辅助设计的基础。如果从事这方 面的深入研究，可以参考中国计算机学会周培德先生的《计算几何&amp;#8212;&amp;#8212;算法分析与设计》。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;概率论与数理统计学&lt;/strong&gt;是这个领域最后一门关键的课程。概率论部分提供了很多问题的基本知识描 述，比如模式识别当中的概率计算，参数估计等等。数理统计部分有很多非常经典的内容，比如伪随机数、蒙特卡罗法、回归分析、排队论、假设检验、以及经典的 马科夫过程。尤其是随机过程部分，是分析网络和分布式系统，设计随机化算法和协议非常重要的基础。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;[二]离散数学&lt;/strong&gt;（Discrete  Mathematics）随着计算机科学的出现与广泛应用,人们发现利用计算机处理的数学对象与传统的分析有明显的区别：分析研究的问题解决方案是连续 的，因而微分，积分成为基本的运算；而这些分支研究的对象是离散的，因而很少有机会进行此类的计算。人们从而称这些分支为"离散数学"。离散数学经过几十 年发展，方向上基本上稳定下来。当然不同时期还有很多新内容补充进来。就学科方向而言，一般认为，离散数学包含：集合论、逻辑学、代数学、图论、组合学。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;逻辑学&lt;/strong&gt;（Logics）我们主要指数理逻辑，形式逻辑在推理问题中也有比较广泛的应用。（比 如我们学校还为此专门开设了选修课程）这方面的参考推荐中科院软件所陆钟万教授的《面向计算机科学的数理逻辑》。现在可以找到陆钟万教授的讲课录像，&lt;a target="_blank" href="http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm"&gt;http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm&lt;/a&gt;。总的来说，学集合/逻辑一定要站在理解的高度上去思考相关的问题。集合论（Set  Theory）和逻辑学构成了计算机科学最重要的数学问题描述方式。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;代数学&lt;/strong&gt;（Algebra）包括：抽象代数、布尔代数、关系代数、计算机代数&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;（1） 抽象代数&lt;/strong&gt;（Abstract  Algebra）研究的主要内容涵盖群、环、域。抽象代表的是将研究对象的本质提炼出来，加以高度概括，来描述其形象。&amp;#8220;欧式环&amp;#8221;就是在将整数和多项式的 一些相同的特点加以综合提炼引入的。抽象代数提供的一些结论为我们研究一些具体问题时所需使用的一些性质提供了依据。推荐一个最简单的，最容易学的材料：&lt;a target="_blank" href="http://www.math.miami.edu/"&gt;http://www.math.miami.edu/&lt;/a&gt;~ec/book/这本《Introduction to Linear and Abstract  Algebra》非常通俗易懂，而且把抽象代数和线性代数结合起来，对初学者来说非常理想。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;（2）布尔代数&lt;/strong&gt;（Boolean  Algebra）是代数系统中最为基础的部分，也是最核心的基本理论。主要包括了集合的基本概念与运算，自对偶的公理系统。是数据表示的重要基础。相信大 家都很清楚它的重要性。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;（3）关系代数&lt;/strong&gt;（Relational  Algebra）应用也是极为广泛，比如数据库技术中的关系数据库的构建就要用到关系代数的相关理论。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;（4）计算机代数&lt;/strong&gt;（Computer  Algebra）大家可能比较生疏，其实它研究的主要内容即是围绕符号计算与公式演算展开的。是研究代数算法的设计、分析、实现及其应用的学科。主要求解 非数值计算，输入输出用代数符号表示。计算机代数的开发语言主要有：ALTRAN,CAMAL,FORMAL。主要应用于：射影几何，工业设计，机器人手 臂运动设计。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;图论&lt;/strong&gt;（Graph  Theory）主要研究的内容包括：图的基本概念、基本运算、矩阵表示，路径、回路和连通性，二部图、平面图，树，以及网络流。图论的应用领域太过广泛， 仅举两个例子：比如在计算机网络拓扑图的设计与结构描述中，就必须用到相当多的图的结构和基本概念。关于网络流更是在电流网络与信息网络的流量计算当中广 泛应用。树的相关应用则无须多言了。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;组合学&lt;/strong&gt;（Combinatorics）有两部分单独的研究领域：组合数学与组合算法。组合学 问题的算法，计算对象是离散的、有限的数学结构。从方法学的角度，组合算法包括算法设计和算法分析两个方面。关于算法设计，历史上已经总结出了若干带有普 遍意义的方法和技术，包括动态规划、回溯法、分支限界法、分治法、贪心法等。应用是相当广泛的,比如旅行商问题、图着色问题、整数规划问题。关于组合数 学，主要研究的内容有：鸽巢原理、排列与组合、二项式系数容斥原理及应用，递推关系和生成函数、特殊计数序列、二分图中的匹配、组合设计。推荐 Richard A.Brualdi的《Introductory Combinatorics》作为参考。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;[三]数论&lt;/strong&gt;（Number  Theory）&lt;/p&gt; &lt;p&gt;数论这门学科最初是从研究整数开始的，所以叫做整数论。后来更名为数论。它包括以下几个分支：&lt;/p&gt; &lt;p&gt;&lt;strong&gt;初等数论&lt;/strong&gt;是不求助于其他数学学科的帮助，只依靠初等方法来研究整数性质的数论分支。比如在数论 界非常著名的&amp;#8220;中国剩余定理&amp;#8221;，就是初等数论中很重要的内容。对于程序设计来说这部分也是相当有价值的，如果你对中国剩余定理比较清楚，利用它，你可以将 一种表达式经过简单的转换后得出另一种表达式，从而完成对问题分析视角的转换。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;解析数论&lt;/strong&gt;是使用数学分析作为工具来解决数论问题的分支。是解决数论中比较深刻问题的强有力的工 具。我国数学家陈景润在尝试解决&amp;#8220;哥德巴赫猜想&amp;#8221;问题中使用的就是解析数论的方法。以素数定理为基础解决计算素数的问题及其算法实现应是我们多多关注的。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;代数数论&lt;/strong&gt;是把整数的概念推广到一般代数数域上去，建立了素整数、可除性等概念。程序设计方面 涉及的比较多的是代数曲线的研究，比如说椭圆曲线理论的实现。 &lt;/p&gt; &lt;p&gt;&lt;strong&gt;几何数论&lt;/strong&gt;研究的基本对象是&amp;#8220;空间格网&amp;#8221;。空间格网就是指在给定的直角坐标系上，坐标全是整数 的点，叫做整点；全部整点构成的组就叫做空间格网。空间格网对计算几何学的研究有着重大的意义。几何数论涉及的问题比较复杂，必须具有相当的数学基础才能 深入研究。&lt;/p&gt; &lt;p&gt;总的说来，由于近代计算机科学的发展，数论得到了广泛的应用。比如在计算方法、代数编码、组合学理论等方面 都广泛使用了初等数论范围内的许多研究成果；现在有些国家应用&amp;#8220;孙子定理&amp;#8221;来进行测距，用原根和指数来计算离散傅里叶变换等。如果你曾经系统的学习过数论 算法，你会发现这个分支学科研究的一些基本问题对程序设计是相当有用的，比如说素数问题、素性测试、因子分解、最大公约数、模取幂运算、求解同余线性方 程。其中的很多问题都是程序设计的基本问题。但这些问题都不能小视，举个例子来说吧，关于求最大公约数的程序，笔者曾经尝试的就可以采用循环语句结构和递 归结构。另外，以大素数为基础的密码体系的建立是近些年数论算法广泛应用的一个重要的原因。原理是大素数的乘积重新分解因数十分困难。RSA公钥加密系统 的构建就是基于这个原理的（三位发明人因此也获得了2002年美国计算机协会颁发的图灵奖）。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;[四]计算理论（Theory of  Computation）&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;涉及的内容是科学计算非常重要的一部分分支，也是大家研究相当多的一部分。主要包括：算法学，计算复杂性， 程序理论。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;算法学&lt;/strong&gt;（Algorithms）在计算机科学理论中有着举足轻重的地位。是解决很多数值型，非 数值型问题的基础。记得一次学校接收招标项目，很多中小型软件厂商都无法完成一个软件的功能模块，就是因为当时他们对一个具体问题的算法不能做出正确的抽 象，最后由我们学校数理学院的一支软件团队承担了这项任务，他们的最终报告体现出来，问题的解决策略只有通过人工神经元网络的反向传播算法。可见在比较有 深度的程序设计中，算法的重要性更为突出。学习算法学要有一个长期的理论和实践的过程。遇到一个具体算法问题时,首先要通过自己描述的数学抽象步骤，看看 自己以前有没有处理过这种问题。如果没有，很可能这个问题是多个算法的综合，或者是需要我们自己去构造算法。这就需要我们有扎实的算法功底，为了打好这个 功底，推荐两套圣经级的书籍首先是Thomas H.Cormen等著的《Introduction to  Algorithms》。对算法学习而言，这一本内容相当的全面。再深一点的就是大家作为常识都知道的《The Art of Computer  Programming》，目前已经出版3册。两本书的价值大家应当都是清楚的。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;计算复杂性&lt;/strong&gt;研究的内容很广，其中包括NP完全性理论，可计算性理论，自动机理论，形式语言理 论（包括广泛应用于编译原理领域的文法，还包括Petri网论的相关内容）以及大家熟知的复杂性度量。时间复杂度、空间复杂度的计算是度量算法非常重要的 参数，也是我们衡量程序优劣程度的重要依据。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;程序理论&lt;/strong&gt;（Theory of  programs）包含了形式语义学，程序验证和并发模型的研究。关于程序验证学习的重要性大家都很清楚，学习的方法自然也是多多结合具体的问题去分析。 关于并发模型，主要研究的就是进程代数，通信系统演算，通信顺序进程。这部分是研究操作系统理论与实现的重要基础。&lt;/p&gt; &lt;p&gt;按照计算机科学数学理论的架构来谈了各方面的内容和一些应用，下面我们再单独来看一些上面没有涉及到的学科 与这些理论的具体结合情况：&lt;/p&gt; &lt;p&gt;设计方面的应用刚才谈的很多，我只再说说数据库原理与技术，这方面用到的重要数学基础主要包括：集合论，二 元关系及其推理（尤其是研究关系数据库），研究数据分布与数据库结构又涉及相当多的图论知识。&lt;/p&gt; &lt;p&gt;计算机科学的发展有赖于硬件技术和软件技术的综合。在设计硬件的时候应当充分融入软件的设计思想，才能使硬 件在程序的指挥下发挥极致的性能。在软件设计的时候也要充分考虑硬件的特点，才能冲破软件效率的瓶颈。达到硬件和软件设计的统一，严格的说这并不轻松，一 般的程序设计者很难将这样的思想贯穿在其程序设计当中。仅举个简单的例子：我们在写一些C语言的程序，必要的时候都会采取内嵌一段汇编指令，这就是比较充 分地考虑了硬件的工作情况，从而能够提高程序运行的效率。所以我们也有必要了解一些硬件的基础知识。关于学习硬件的时候常会用到的基本数学思想也是相当多 的，拿电路基础与模拟电路来说，我们就经常要利用多元函数，不等式计算进行电流电压的计算。能量的计算还常常涉及微积分学的很多计算。在数字电子技术当中 （有时也称数字逻辑学）数理逻辑，尤其是逻辑演算部分运用相当广泛，数制转换更是非常重要的基础，各种数字电路参数的计算则是多元函数，不等式的计算解决 的问题。&lt;/p&gt; &lt;p&gt;从事计算机硬件程序设计的程序员，则不可回避的就是数字信号处理。这门科学所用到的数学基础主要有：三角函 数、微积分、高次方程求解、数值逼近，傅里叶变换。在滤波器的设计当中还会用到矩阵运算。笔者曾经研究过一个VC++环境下开发的滤波器的模拟软件，就是 利用莱文逊-杜宾递推算法，在较大规模的矩阵运算基础上进行的。当然，开发的环境不一定是这个，你也可以选择MATLAB或者纯C语言编译器。如果我们不 了解相关的数学基础，不要说程序设计，就算是建立运算模型都是相当困难的。&lt;/p&gt; &lt;p&gt;一些周围的同学和一些在职的程序员，大家经过一段时间的学习，普遍都觉得数学对学习计算机和研究计算机程序 设计等问题来说非常重要，但是又苦于无从下手。上面比较全面地谈及了计算机科学数学理论的相关内容。需要特别指明的是，我们研究问题的精力是有限的，如果 您是在校的计算机系学生，则可以对上面的方方面面都有所涉及，以尝试计算数学这个强大的理论工具。为今后的工作奠定一个坚实的基础。但是如果您研究的是比 较具体的工作，我们并不推荐您研究所有的内容，最好的方法就是对上面的数学基础都有些了解，然后遇到具体工作，需要哪部分内容，再进行深入的学习与研究。 这样针对性比较强的学习效果是会比较显著的。对于上面推荐的一些参考材料，除非你要花相当长的一段时间来提高你的计算机数学理论。否则也没必要每一页，每 一本都字字精读，还是那个原则，按需索取其中的内容。学习的方法描述起来就一句话：结合具体的问题，深入的理解数学理论知识，将理论程序化，尝试用程序设 计实现理论原理。达到这样的程度，问题基本上都可以解决的。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;参考文献&lt;/strong&gt;：&lt;br /&gt;《计算机科学技术百科全书》中国计算机学会 清华大学出版社&lt;br /&gt;《工程数学&amp;#8212; 线性代数》同济大学数学教研室 同济大学出版社&lt;br /&gt;《数值分析》李庆扬 华中科技大学出版社&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Henrya2/aggbug/1690849.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Henrya2/archive/2010/03/21/1690849.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/02/21/1670679.html</id><title type="text">致初学作曲的业余音乐爱好者 (转载)</title><summary type="text">（一） 首先声明，这个是给业余初学者看的，高手们就算了，可以来挑挑错。  看来有不少业余作曲爱好者啊，当然我也是其中之一。我们业余人士写作主要凭感觉，但 是感觉也不是随便来的。有很多写作的规律，还有禁忌，算是定式吧，我由于一开始不知道，所以走了很多弯路。我希望能和大家分享我的一些经验，如果不打算系 统地学习乐理的话，少走一些弯路。 首先，来说说音阶，因为这里有很多术语回头会用到，所以必须从这里说起...</summary><published>2010-02-21T10:18:00Z</published><updated>2010-02-21T10:18:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/02/21/1670679.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/02/21/1670679.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 9pt;"&gt;（一）&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;首先声明，这个是给业余初学者看的，高手们就算了，可以来挑挑错。 &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;看来有不少业余作曲爱好者啊，当然我也是其中之一。我们业余人士写作主要凭感觉，但 是感觉也不是随便来的。有很多写作的规律，还有禁忌，算是定式吧，我由于一开始不知道，所以走了很多弯路。我希望能和大家分享我的一些经验，如果不打算系 统地学习乐理的话，少走一些弯路。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;首先，来说说音阶，因为这里有很多术语回头会用到，所以必须从这里说起。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;常用的音阶有六种，包括一种大音阶，三种小音阶，半音阶和全音阶。通常旋律与和声， 还有调式等都是构造在大音阶或小音阶上的。这是一部乐曲的基础，所以在了解一切之前必须先了解这个。一般人都喜欢从音程开始入手，可是我感觉音程没什么可 说的，无非是根据跨越的半音数量来起个名字。现列表如下，讲解略去。&lt;span&gt;&lt;br /&gt;&amp;nbsp;包含半音数量&amp;nbsp;音程名称&amp;nbsp;举例&lt;br /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;小 二度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;bD&lt;br /&gt;&amp;nbsp;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;大二度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;D&lt;br /&gt;&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;小三 度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;bE&lt;br /&gt;&amp;nbsp;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;大三度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;E&lt;br /&gt;&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;纯四度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;F&lt;br /&gt;&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;增 四度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;#F&lt;br /&gt;&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;纯五度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;G&lt;br /&gt;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;小六 度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;bA&lt;br /&gt;&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;大六度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;A&lt;br /&gt;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;小七度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;bB&lt;br /&gt;&amp;nbsp;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;大 七度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;B&lt;br /&gt;&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;纯八度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;c&lt;br /&gt;&amp;nbsp;13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;小九度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;bd&lt;br /&gt;&amp;nbsp;14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;大 九度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;d&lt;br /&gt;&amp;nbsp;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;小十度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;be&lt;br /&gt;&amp;nbsp;16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;大十度&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C&amp;nbsp;-&amp;nbsp;e&lt;br /&gt;只 是注意一点，不把数学概念用在这里。比如，两个纯四度相加不是纯八度，而是小七度。还有，度前面的数字是根据大音阶上音的数量计算的。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;废话少说，开始说音阶。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&lt;br /&gt;大小音阶各有七个音，分别构成音阶的七个级。最 基本的音阶是自然大音阶，就是do&amp;nbsp;re&amp;nbsp;mi&amp;nbsp;fa&amp;nbsp;sol&amp;nbsp;la&amp;nbsp;ti。这是按照五度相生法构造的。具体构造方式不实用，这里就略去了。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;每个级的音都有自己的名称，下面按照重要程度一一叙述。以C&amp;nbsp;D&amp;nbsp;E&amp;nbsp;F&amp;nbsp;G&amp;nbsp;A&amp;nbsp;B为例，唱名仅按照该大调音阶。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;C(dol)是主音，是自然大音阶的根本之根本，音阶的 名称也是根据这个音来的。比如C&amp;nbsp;D&amp;nbsp;E&amp;nbsp;F&amp;nbsp;G&amp;nbsp;A&amp;nbsp;B叫C大调音阶，E&amp;nbsp;#F&amp;nbsp;#G&amp;nbsp;A&amp;nbsp;B&amp;nbsp;#c&amp;nbsp;#d叫E大调音阶等等。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;G(sol)是属音，其重要性仅次于主音。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;F(fa)是下属音，也是非常重要的音。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;D(re)是二重属音，也就是属音的属音。因为在一个调 子的属调里面，属音就是原来调子的二重属音。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;E(mi)是中音，因为它的位置在主音和属音中间。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;A(la)是下中音，因为它的位置在下属音和主音中间。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;B(ti)是导音，这是音阶中最不稳定的音，有强烈的进 入主音的要求。所以，尤其是在终止式里面，导音进行到主音几乎是一切进行中优先级最高的。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;嗬嗬，这些还是预备知识，虽然可能有很多人知道，不过以后频繁要用到，所以为了让更 多业余爱好者了解，还是提了一下。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&lt;br /&gt;自然大音阶最大的特点就是三音是大三度(当然是 和主音的关系)。在自然大音阶里面，所有音程不是大音程就是纯音程，没有小音程的。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;现在开始说三种小音阶。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;首先，和声小音阶。所谓和声小音阶就是把大音阶的三度和六度变成小音程。这两个音(中音和下中音)是对调性最敏感的两个音，把它们变成小音程会是音阶的色彩从太阳变成月亮，从阳性变成阴性。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;比如&lt;span&gt;C大调：C&amp;nbsp;D&amp;nbsp;E&amp;nbsp;F&amp;nbsp;G&amp;nbsp;A&amp;nbsp;B， 对应地c小调和声音阶应该是C&amp;nbsp;D&amp;nbsp;bE&amp;nbsp;F&amp;nbsp;G&amp;nbsp;bA&amp;nbsp;B。本来是do&amp;nbsp;re&amp;nbsp;bmi&amp;nbsp;fa&amp;nbsp;sol&amp;nbsp;bla&amp;nbsp;ti，可是听起来却像是 la&amp;nbsp;ti&amp;nbsp;do&amp;nbsp;re&amp;nbsp;mi&amp;nbsp;fa&amp;nbsp;#sol&amp;nbsp;la。待会儿还会说到。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;和声小音阶的特色是那个增二度。即从小六度到大七度的跳变&lt;span&gt;(忘了说了，呵呵，大音程和纯音程多一个半音是增音程;小音程和纯音程少一个半音是减音程。)这个音阶的无限魅力就在这个跳变 上。许多欧洲作曲家在模仿东方异国情调的时候都喜欢来回来去地强调这增二度。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;另一个小音阶是旋律小音阶，这个音阶只有三度是小音程，其他都和大音阶一样。所以， 我认为一个音阶的三音是决定这个音阶色彩的最重要一个音。不过注意这个音阶在下行的时候是要把六度和七度全都变成小音程的。这种做法由于抹平了那个增二 度，所以旋律更加圆滑了。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;最后，自然小音阶。这个音阶的三度，六度和七度全都是小音程。这样，&lt;span&gt;do&amp;nbsp;re&amp;nbsp;bmi&amp;nbsp;fa&amp;nbsp;sol&amp;nbsp;bla&amp;nbsp;bti就完全变成了la&amp;nbsp;ti&amp;nbsp;do&amp;nbsp;re&amp;nbsp;mi&amp;nbsp;fa&amp;nbsp;sol。于是，我们不用 主音作为小调的调名，而是用三音。这样，小调的谱号就要从上方小三度的大调去借，这是小调会多出三个降号来。比如，C大调没有升降号，可是c小调却有三个 降号;又如，#F大调是六个升号，可是#f小调却只有三个升号。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;半音阶。顾名思义就是由半音组成的，一共十二个音。用处很广，不过最好熟练掌握之后 再用。最早是mozart提倡的，他带得他的老师haydn都开始用半音阶了，而且相当精彩。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;全音阶。当然都是全音了，每两个音之间都是大二度。由于&lt;span&gt;12/2=6，所以全音阶实际上只有两个：C&amp;nbsp;D&amp;nbsp;E&amp;nbsp;#F&amp;nbsp;#G&amp;nbsp;bB和bD&amp;nbsp;bE&amp;nbsp;F&amp;nbsp;G&amp;nbsp;A&amp;nbsp;B。这种音阶没有调性，听 起来很玄。是德彪西的最爱。如果是初学者的话尽量避免，如果要八度老兄那样的我就管不着了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;终于说完了，这些是点基本理论，还有很多旋律和声部写作的惯例和禁忌，以后还有，呵 呵。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;（二）&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;呵呵，这回轮到曲式了。说到曲式，那可是我最早接触的音乐理论之一了，我看的是匈牙 利近代三大音乐家之一魏纳。莱奥所作的&lt;span&gt;&amp;lt;器乐曲式学&amp;gt;，用贝多芬的钢琴奏鸣曲作蓝本讲述以器乐为主的 奏鸣套曲中的曲式。 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;我之所以在高中的时候就开始看曲式，主要因为曲式相对于其他学科来说对专业要求比较 少，只要知道一些关于调性的东西就可以了，不像对位法，死难死难的，科班的都学不好。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;好了，现在开始。再重申一下，我不是专业，所以我讲的就是经验之谈，不是书本知识。(当然，也有来自书本的经验)&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;一首乐曲中，最小的单位是什么&lt;span&gt;?音。废话! 不过单音没有任何意义，也就省去了，放到旋律的写法中来讲。在创作中，最小的单位应该是动机了。所谓动机，就是展示你旋律特征的一到两小节的短旋律，不要 求完整，只是把鲜明的特征表述出来即可。一个模进的旋律就是由一连串动机构成的。动机是构成音乐的基本素材，无论是呈示，还是展开，都要用到这样的素材作 基础。各个段落以及乐章之间的紧密联系也都是和动机分不开的。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;一部音乐，最重要的主题，没有主题的音乐好像没有脑袋的人&lt;span&gt;(嗬嗬嗬，有点儿荒诞吧?)，是不可理解的。主题的定义很模糊，魏纳。莱奥也没有给出一个确切的定义。总之能让听者进入状态的 就是主题了。主题也有好多的结构呢，从最简单的乐句到复杂的综合乐段，都是主题。大家在写作的时候可以挑选着用，我来一一描述一下：&lt;br /&gt;&amp;nbsp;乐句：一个 完整的句子，就像写文章一样，一直到让人产生"句号"的感觉(也就是终止)为止。乐句的终止可以是完全终止(结束在主和弦上)，也可以是不完全终止(结束 在属和弦上)。甚至可以不用终止，直接进入下一段。这时没有终止的乐句就称作开放式乐句。比如钢男的那个impromptu的中段(Trio，三声中部， 一会儿会讲到。)就是一个开放式乐句。&lt;br /&gt;&amp;nbsp;重复乐句：超级简单，就是把一个乐句重复一下，不改动或者作一些修饰性质的改动。mozart特别喜欢用 这种重复乐句。&lt;br /&gt;&amp;nbsp;乐段：也是由两个类似的乐句构成，不同于重复乐句的是，在终止上作了本质的修改。最普通的做法是前乐句不完全终止，后乐句是完全 终止。这个非常常见，在mozart等人的sonata里面经常出现，大家应该有所体会。另外在前后乐句之间可以插入短小的动机作为连接。&lt;br /&gt;&amp;nbsp;重复 乐段：不用我再废话了吧?两个一样的乐段。在小步舞曲(menuetto)当中大量出现。&lt;br /&gt;&amp;nbsp;三部乐段：呵呵，这个有些像元曲当中的"鼎足对"，就 是把原来两部分的东西变成三部分了。分成前乐句，中乐句和后乐句。这时三个乐句的终止式就非常微妙，有兴趣不妨琢磨一下。beethoven在处理时意外 地把中间的的乐句转到下属调上，然后在下属调上面用了个完全终止。&lt;br /&gt;&amp;nbsp;复合乐段：就像把乐句攒成乐段那样，就可以把乐段攒成复合乐段。&lt;br /&gt;&amp;nbsp;综 合乐段：如果乐段前后乐句在材料上(也就是动机上)发生了本质的变化，或者说前后乐句用的不是一个材料，这样构成的乐段就是综合乐段。这种乐段会让你的作 品更加富有变化。&lt;br /&gt;&amp;nbsp;三部综合乐段：三部乐段，其中每一部分都是不同的素材，就是这种乐段。这是最复杂，最奇妙的一种，因为，三个部分可以是乐句， 也可以是乐段，也可以交替使用。&lt;br /&gt;&amp;nbsp;注：乐段也可以是开放的。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;这些其实是一些基本的主题结构，魏纳。莱奥之所以讲了许多是因为后面他要分析&lt;span&gt;beethoven全部的32部sonata，在我们业余爱好者来说，不必了解的那么精深，大略知道一些就足够了。下面开始 讲真正的重头戏--曲式。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&lt;br /&gt;从二部曲式开始吧。这个可是最最基础的曲式了， 可以说一切的曲式都是从这个演变来的。因为在最初写作的时候，作曲家最简单的方法不过是把曲子分成两部分，随后这两部分就逐渐有了定型。单二部曲式的结构 是(A&amp;nbsp;B)，也就是两个部分。这不仅仅是简单的划分，而是互相有联系的。通常A段是以不完全终止结束，然后B段用A段的素材在变化和弦，通常是七和弦或 九和弦上开始，最后再用相似的材料在完全终止上结束。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;在&lt;span&gt;bach和haydn的作品中 (haydn限于早期，因为晚期他已经把奏鸣曲式发展出来了)，有大量的这种曲式出现，但是稍有不同。在B段的末尾有大量的A段素材出现，造成了结构听上 去像(A&amp;nbsp;BA)，这样的二部曲式称作带有再现的二段曲式，比通常的更加完善一些，这种结构也直接导致了三部曲式的出现。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;三部曲式中，&lt;span&gt;(也叫三段式，不过名字听起来 有些。。。想起亚理士多德和卢卡西维奇来了。)三部曲式的结构为(A&amp;nbsp;B&amp;nbsp;A)，和带有再现的二段曲式很像，但是不同在于B段相对独立，可以完全使用新的 材料，也可以继续使用A段的材料。而且再现A段相对完整，而不是只有一个A段特征的小乐段加上一个完全终止。这里的再现A几乎可以和呈示A一模一样。重复 一般为(||：A：||：B&amp;nbsp;A：||)，也有省略前面或者后面重复的。A或B只有一个乐句或者乐段，不可再分的，称作单三部曲式。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;有单三部曲式，当然就有复三部曲式啦&lt;span&gt;!如果 A段或B段本身又是一个二段或三段式，整个乐曲就是一个复三部曲式了。这是乐曲的结构已经相当丰富，完全可以作为套曲的一个乐章了，这就是第三乐章，小步 舞曲(menuetto)或者谐谑曲(scherzo)。回头要说。现在研究研究复三部曲式的调性和结构。复三段式的中间B段在早期作品中一般以三重奏 (Trio)的形式出现，称作三声中部。大多数情况下三声中部用另外的调性，这样可以让听众不至于在长大的作品之中感到烦躁。当然也可以不转调。至于转向 的调性，通常有以下几种：&lt;br /&gt;1、属调：颜色更加明亮。&lt;br /&gt;2、下属调：颜色更加柔和，这是速度宜放慢，要是保持速度不变的话至少也要把节奏放 慢。&lt;br /&gt;3、同名大小调：颜色的性质发生了变化。&lt;br /&gt;4、上方大三度的调性：色彩忽然闪亮。&lt;br /&gt;5、下方大三度的调性：色彩忽然变得柔和，有 圆号的感觉。&lt;br /&gt;另外复三部曲式结构还可以加以变化，比如前面加引子，后面加尾声，或者使用多个三声中部等等。两个三声中部的结构如下：A：二段式主 题--B：三声中部I--A：二段式主题--C：三声中部II--A：二段式主题。这时至少要有一个trio转调，否则就会使乐曲枯燥无比，即使是催眠曲 也将不会有这样好的催眠效果。&lt;br /&gt;j。s。bach的勃兰登堡协奏曲第一部最后乐章就是复杂的复三段式，结构为：A：二段式主题 --B：Trio_I--A：二段式主题--C：波兰舞曲--A：二段式主题--D：Trio_II(这个我在共享区上传过)--A：二段式主题。长大， 没有转调，但巴赫借助乐队的变化避免了枯燥。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;复三部曲式经过进一步变化之后，发展成了两个非常常用的复杂的曲式--奏鸣曲式和回旋曲式。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;奏鸣曲式吗，自然是在奏鸣曲里面大有用武之地了。九成以上的奏鸣曲第一乐章都是奏鸣 曲式的。在这种优美的曲式里面，对称的美与不对称的美做到了统一，规律与变化达到了和谐。奏鸣曲式的大结构是这样的：&lt;span&gt;(引子)--呈示部--展开部--再现部--(尾声)。括号里面的可以省略。每一个部分都有详细的结构：&lt;br /&gt;呈示部：主部 主题--(连接部)--副部主题--结束主题群。&lt;br /&gt;展开部：相当自由，没有什么限制。&lt;br /&gt;再现部：主部主题--副部主题--结束主题群。&lt;br /&gt;现 在研究一下调性。&lt;br /&gt;呈示部：主部主题自然出现在乐曲的调性上，副部主题就要转调了，而且这个转调在呈示部是必须的。一般大调转向属调，或者上方大三 度(比如贝多芬&amp;lt;黎明&amp;gt;，C转E)，有时也往下属调转;小调最常见的是转到关系大调(如c-&amp;gt;C)，同名大调(如c-&amp;gt;bE)或 者是属调。可以直接转调，也可以通过一个插部来过渡。跟在副部主题后面的，是一个一个的结束主题。主题的数量是乐曲规模的标志，一般在三四个左右。 mozart的曲子里面结束主题排列有序，整齐化一，是标准的参考资料。呈示部一般重复一遍。&lt;br /&gt;展开部：一般来说展开部没有什么限制，素材可以从呈 示部或引子里面拿，也可以出现新的旋律。但是也不是一点限制都没有，所谓调性的自由是指要不停地转调，转调，转调，一直到转的彻底晕菜了为止。等到实在不 行了，再把调性引回来到再现部。&lt;br /&gt;再现部基本上是呈示部的重复，不过有些人喜欢在主部主题把调性转到下属调上去。这一次的副部主题不能再转调了，因 为乐章接近结尾，要把调性稳定下来了。小调奏鸣曲的大调副部主题要改回小调，并要在乐章的调性上面。结束主题也要力求平稳，可以做同名大小调的变化，但不 可有太大的动作。在协奏曲的奏鸣曲式中，再现部结束主题的末尾部分可以安排一个长长的大三和弦，然后可供独奏者演奏华彩段。可以加入尾声，尾声可以向下属 调离调，是很不错的处理方式。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;还有一种简单的小奏鸣曲式，就是用一个经过句代替展开部。有一个很有名的例子就是mozart&amp;lt;费加罗的婚礼&amp;gt;序曲。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;回旋曲式。回旋曲叫&lt;span&gt;Rondo，源自欧洲的 一种乡村舞曲形式--轮舞。这种曲式的特点就是有一个风格鲜明的主题，反复出现，至少三次以上。最适合用作套曲的终曲。海顿创立的原则就是最后一个乐章为 乡村舞曲风格的Rondo。回旋曲式有两种形式，下面容我一一道来：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;第一种：简单回旋曲式。这个有点像经过扩展的复三段式，结构为主题&lt;span&gt;--插部I--主题--插部II。。。--主题--(尾声)。不同的是插部的体裁不限，不一定是trio。而且主题每次出现都 可以做各种修改，甚至调性都是自由的，你可以来回来去地改变调性，只要在结束的时候改回来就可以了。插部的安排，调性的变换，一切都在你的控制之中。这种 结构通常用在第二乐章慢板和终曲当中，一个很好的例子就是mozart的弦乐小夜曲ein&amp;nbsp;klein&amp;nbsp;nacht&amp;nbsp;musik，&amp;nbsp;kv525的终曲。调 性变换非常频繁。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;第二种：奏鸣回旋曲式。呵呵，这个有些像回旋曲，结构是呈示部&lt;span&gt;---展开部--再现部。怎么一样呢?!嘿，细节不一样，来看一下：&lt;br /&gt;呈示部：主题--副群--(主题)。所谓副群就是 副部主题加上结束主题，有时只有副部主题。要是没有那个括号里面的主题不就是奏鸣曲式了吗?没错，可是这会的括号里面的主题很少省略。调性吗，副群转调 啊，其他都在本来调性上。&lt;br /&gt;展开部：这次可更加自由了，不光能像奏鸣曲式那样乱转一气，还能用类似复三段的trio来代替展开部。更有甚者，还可以 用更加自由的幻想曲来代替展开部。至于其他形式吗，看作者的喜好了。不过要避免重复，因为Rondo本来重复就够多的了。&lt;br /&gt;再现部：主题--副群 --主题+尾声。最后的尾声和主题是很紧密的，而副群也回到了原来的调性。&lt;br /&gt;嘿嘿，这不就是奏鸣曲式多出现一次主题吗?没错，所以叫奏鸣回旋曲式。 很工整。下面来看一下完整结构：&lt;br /&gt;主题--副群(转调)--主题--展开部(或trio，或fantasy)--主题--副群(不转调)--主题+ 尾声。&lt;br /&gt;再对比一下普通回旋曲：&lt;br /&gt;主题--插部I--主题--插部II--主题--插部III。。。主题+尾声。&lt;br /&gt;呵呵，原来就是一种 特殊形式啊。不错，这样的曲式在终曲里面应用最广。如beethoven悲怆奏鸣曲的终曲，中间用的是trio。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;最后一种，变奏曲式。这个不难，首先有一个主题，一般是二段式，速度中庸。在这个主 题的基础上发展出无数的变奏，一般调性不发生变化，最多就是同名大小调之间的变换。不过速度和风格可一定要有丰富的变化，否则本来主题和变奏就很像。。。&lt;span&gt;&lt;br /&gt;当然，还有一种不规则的变奏，无论是和声还是调性都可以与主题相去甚远。&lt;br /&gt;在结尾一般有一个尾声，或者快速的 变奏，要么就是把主题再现，然后加上尾声(常用)。&lt;br /&gt;看一看结构：&lt;br /&gt;主题--变奏i--变奏II--变奏III。。。(主题)+尾声。&lt;br /&gt;代 表作：舒曼的&amp;lt;交响练习曲&amp;gt;，里面有各种各样的变奏，有规则的，也有不规则的，一共十几个。尾声写的漂亮极了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&lt;br /&gt;哈，终于打完了。不过还有套曲的整体结构没有 说，下次再说吧。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;（三）&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;曲式还有一种，就是套曲的曲式。&lt;span&gt; &lt;br /&gt;&lt;br /&gt;一 般的套曲，指的是奏鸣套曲，由演奏乐器的不同，所得的名称也不同：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;单一乐器演奏的，叫奏鸣曲或无伴奏奏鸣曲。如钢琴奏鸣 曲，无伴奏小提琴奏鸣曲。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;由独奏乐器加上伴奏乐器演奏的，叫独奏乐器的奏鸣曲。 如小提琴奏鸣曲(小提琴和钢琴/吉他)。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;由少量独奏乐器演奏，每兼乐器只负责一个声部的，叫重 奏曲。如弦乐四重奏(小提琴两把，中提琴，大提琴。)，钢琴三重奏(钢琴，小提琴，大提琴)，木管五重奏(长笛，单簧管，双簧管，大管，圆号)。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;由独奏乐器(可以是多个)和乐队演奏的，叫独奏乐器的 协奏曲。如圆号协奏曲，管弦乐队协奏曲，声乐协奏曲。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;由完整的管弦乐队演奏的，叫交响曲。交响曲有时加入合 唱队。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;无论是哪一种套曲，统称为奏鸣曲。比如，交响曲只是奏鸣曲的一种，钢琴奏鸣曲也是奏 鸣曲的一种。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;现在说说奏鸣套曲的结构。这个结构是经过长期发展得到的，最后在海顿手中得以定型， 因此人们称海顿为"交响乐之父"。今以奏鸣曲为例。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;一般，奏鸣曲分为四个乐章，按照快慢相间的原则来配置。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;第一乐章，通常为快板(Allegro)，曲式一般用 奏鸣曲式，是最紧张，最具有戏剧性的一个乐章。第一主题常常很鲜明有力，第二(副部)主题则以歌唱性的旋律和声为主，强调与第一主题的对比。展开部千变万 化，这一切都构成了第一乐章的特色。第一乐章是整部作品的核心。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;第二乐章，以慢扳 (Largo，&amp;nbsp;Adagio，&amp;nbsp;Andante，&amp;nbsp;Lento等)的浪漫曲为最常见，为的是强调和第一乐章的对比。曲式比较自由，一般用简单的二段式或 三段式，另外变奏曲也比较常见，奏鸣曲式和回旋曲式亦不少见。该乐章是整部作品中最为深沉的一个乐章。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;第三乐章，这个比较固定，一般不作变化。要么是中庸速 度(Tempo&amp;nbsp;di&amp;nbsp;Menuetto)的小步舞曲，要么是急速(Presto或Vivace)的谐谑曲。曲式用的都是复三段式。在小型的独奏奏鸣曲 中，这个乐章经常被省略，要么就是和终曲结合在一起。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;第四乐章，终曲，急速(Presto，&amp;nbsp;Vivace 等)，在海顿的作品中是舞蹈的场面，在贝多芬的作品中则是胜利的结论。采用回旋曲式最多。是速度最快，情绪最高的乐章，一定不能被上一个乐章压制住。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;在这些乐章之间有时还可以加入其他成分，比如我就加过间奏曲。不过是后期的做法。后 期甚至把四个乐章写到一个乐章里面，号称但乐章交响曲。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&lt;br /&gt;以上是奏鸣套曲，下面简要介绍一下古组曲 (Suite或Partita)的套曲曲式：&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;Bach的作品一般按照A-C-S-O-G的格式。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;A：Allemande舞曲，亦称作德国舞曲，因为那 个词在法语中就是指德国的一个民族。速度中庸。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;C：Courante舞曲，有法国式和意大利式两种。 前者强调高雅，后者强调流畅。快速。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;S：Sarabande舞曲，西班牙舞曲，以符点为特 色。贝多芬在&amp;lt;艾格蒙特&amp;gt;序曲中模仿过这种节奏。慢速。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;O：Optional，只要不和其他乐章重复，可以任 选一个舞曲作为这个乐章。一般有一下几种：&lt;br /&gt;&amp;nbsp;&amp;nbsp;Menuetto：小步舞曲，唯一保存到奏鸣套曲中的舞曲。&lt;br /&gt;&amp;nbsp;&amp;nbsp;Bouree：布列舞曲。&lt;br /&gt;&amp;nbsp;&amp;nbsp;Gavotte： 加沃特舞曲。&lt;br /&gt;&amp;nbsp;&amp;nbsp;Passpied：帕斯比耶舞曲，源自法国，小步舞曲的前身。&lt;br /&gt;&amp;nbsp;&amp;nbsp;Rigaudon：里高东舞曲，源自英国。格里格有很 出色的作品。&lt;br /&gt;&amp;nbsp;&amp;nbsp;Musette：风笛舞曲。&lt;br /&gt;&amp;nbsp;&amp;nbsp;Loure：古风笛舞曲。&lt;br /&gt;&amp;nbsp;&amp;nbsp;Polonaise：波兰舞曲，肖邦有大量名作。&lt;br /&gt;&amp;nbsp;&amp;nbsp;Anglaise： 英国舞曲。&lt;br /&gt;&amp;nbsp;&amp;nbsp;Air：咏叹调。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;G：Giga，吉格，苏格兰三拍子舞曲，急速，很像奏 鸣曲的终曲。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;可以看出，古组曲是由一连串的舞曲组成的。不错，因为套曲是从给舞蹈的伴奏中独立出 来的。它最大的一个原则就是快慢相间，最早的套曲就是由一首慢速的孔雀舞和一首快速的加亚尔德舞构成的。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;下面分析一下钢男的即兴曲，嘻嘻。请有兴趣者到钢男(钢琴男孩)发的"[原创]仿古即兴曲"贴子里面下载谱子。(技术论坛的音乐理论那里，那个是原作。)&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;整体结构是单三段式，调性为&lt;span&gt;a-&amp;gt;A-&amp;gt;#F-&amp;gt;a。 谱子上的调号标记有些错误，最后再现A段应该是还原成C调的调号。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;A段，1-17小节(算弱起小节)。A段是一个合乐段， 因为前后两个乐句材料上没有发生变化，但是终止变了，后乐句出现了频繁的转调。第一小节是弱起，到第九小节为止是前乐句，实际上是一个八小节的乐句，停在 半终止上;后乐句有些复杂，前四个小节重用前乐句，但是伴奏更加丰富。从14小节开始转调。14小节转到A大调，16小节是#f小调，17小节是#F大 调，最后是#F大调的完全终止。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;B段，18到27小节。开放乐段。18-25为前乐句， 半终止;重复一遍为后乐句，但是由于终止不同，所以不是重复乐句。27小节一开始是完全终止，但是立刻就转到了a小调，并开放着。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;A段再现。基本没有变化，最后的大调改成了小调。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;关于&lt;span&gt;B段的开放性我还是有一些疑问。因为如 果把27小节那几个音看作是连接的话，B段就是一个以完全终止结尾的封闭乐段了。就像A段，结尾出也有一个连接用的音。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;（四）&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;这次说说什么呢？ &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;音乐是由三大要素构成的：旋律，和声和节奏。节奏没什么可说的，无非就是两拍子&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;强、弱，三拍子强、弱、弱，四拍子强、弱、次强、弱，其它的都是这几种的组合。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;主要来说说旋律以及和声。这些都是我平时得出的一些经验，结合书本上的理论。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;关于旋律，我记得书上大致是这么说的：&lt;span&gt;&lt;br /&gt;1、 主音，属音和下属音本性平稳，称为&amp;#8220;静音&amp;#8221;；而重属音，中音和下中音本性多变，称为&amp;#8220;动音&amp;#8221;。&lt;br /&gt;2、第七度本性极不稳定，称为&amp;#8220;导音&amp;#8221;。&lt;br /&gt;3、 动音要解决到相邻的最近的静音之一，而导音要上行解决到主音。&lt;br /&gt;4、旋律的进行有四种，同音反复，级进，小跳和大跳。&lt;br /&gt;5、一度音程的进行为 同音反复，二度音程的进行为级进，三度到五度为小跳，五度以上为大跳。&lt;br /&gt;6、大跳不宜使用，如果要用的话必须保证前后两个音在同一个和弦内。跳进之 后一般反向进行。&lt;br /&gt;7、有一种跳进可以任意使用，就是下行跳至导音，然后导音解决到主音。&lt;br /&gt;8、旋律的线条，节奏要有一定规律，不能谁和谁也 挨不上边。&lt;br /&gt;9、模进就是同样的旋律在不同的高度反复出现。模进一般不超过四次，是好的做法。&lt;br /&gt;10、乐句结尾处是属和弦，称为半终止或不完 全终止；若是主和弦，则成为全终止或完全终止。如果应该解决到I和弦的，却解决到VI和弦上去了，则称做假终止。&lt;br /&gt;11、前后乐句要有联系。关于乐 句的结构请参看《曲式》一章。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;书上大致就是这些。我自己在写作中还有一些体会，下面一一说来。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;1、回音鼓励使用。&lt;br /&gt;&amp;nbsp;所谓回音就是1231或者 1232形状的音，在哈农里面非常常见。写作时无论是在连续快速的无穷动式的进行当中，还是在歌唱般的旋律中，回音都大有用场。不管是巴赫，海顿，莫扎特 还是贝多芬，向上和向下两种方向的回音在他们手中都能够游刃有余。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;2、音阶级进鼓励使用。&lt;br /&gt;&amp;nbsp;音阶级进的用处就更广 泛了，可以每个音用一个和弦，也可以一大段用一个和弦。不要小看普通的音阶，如果用得恰当会给你的作品增色不少。在海顿的交响曲作品中，音阶就有着出神入 化的表现。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;注：由于回音和音阶属于级进，所以在快速进行的时候这种二度必然会导致大量和声外音 的出现。如何选择和声就成了非常重要的问题。一般有两种选择方式：选择奇数音作为和弦主干，或者选择偶数音作为主干。前者比较常见，因为强拍一般在奇数音 上，推荐使用，尤其是在连续进行的时候；后者也出现过，这时奇数上的音被当作类似倚音的装饰来处理。比如&lt;span&gt;mozart 的土耳其风格回旋曲。其实在这种处理中，整个回音或音阶必须很短，而且本身也具有装饰音的性质。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;3、不推荐使用半音阶和全音阶。&lt;br /&gt;&amp;nbsp;尤其是后者， 奉劝初学者不要过早模仿debussy之类的人物。可以看一看此公早期的arabesque，完全是传统的写作方法。毕加索早年的习作不在过去的任何一位 传统画家之下。即使认为有必要使用半音阶，也要极为谨慎，而且应该在熟悉了海顿和莫扎特的处理方式之后。否则一定不要自以为是，要知道写不好正楷的人是没 有资格写草书的。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;4、琶音是很好的处理方法。&lt;br /&gt;&amp;nbsp;琶音不涉及和声外 音的问题，而且可以随着和弦的变化改变自己进行的方式，所以比起音阶和回音更容易掌握。只是注意进行方向，一般琶音进行完毕旋律反向进行。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;5、简单模进有类似音阶的效果。&lt;br /&gt;&amp;nbsp;简单的模进就 是13243546之类的形状，每两个音是一个三度，因此可以看作是两个一组的音阶。莫扎特经常用这种音型和音阶一起出现。为了构成完整的音阶，可以将结 构稍微作一些调整。另外这种音型也同样可以用作装饰效果。比如海顿后期的bE大调钢琴奏鸣曲。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;6、可以在进行中加入和弦共同音&lt;br /&gt;&amp;nbsp;比如在主属 （I-&amp;gt;V）连接或主下属(I-&amp;gt;IV)的连接中，有共同的音。主属的共同音是属音，主下属的共同音是主音。可以在两种和弦不停变换的时候把 共同的音放在中间。共同的音也可以放在一个类似音阶的进行中间。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&lt;br /&gt;下面说一下两个声部的写作规律。&lt;br /&gt;1、首 先声明一点，我没有学过对位法，所以只能说一下我的经验而已。&lt;br /&gt;2、两个声部一点要划分清楚，其中一个声部是旋律声部，另一个声部是低音声部。&lt;br /&gt;3、 低音不意味着没有旋律，低音也可以有很好的旋律，而且有时两个声部可以对调，不过不可为时过长。&lt;br /&gt;4、低音尽量不与旋律重复，这样才能够使整体效果 更加丰富。&lt;br /&gt;5、在旋律单调性（嘿嘿，借用函数术语。）比较强的时候，建议低音以相反的方向进行。&lt;br /&gt;6、如上的倒影是很好的效果，但交叉的部 分声部不免有重叠。这个没关系，只是临时的现象。&lt;br /&gt;7、声部重叠绝对不能出现到两个音以上，除非是两个声部在齐奏（tutti）。否则就会构成意外 的平行八度。&lt;br /&gt;8、注意和弦连接，不要出现和声上的禁忌。&lt;br /&gt;9、平行五度也要尽量避免。&lt;br /&gt;10、平行三度和平行六度是很好的进行。还可 以通过八度平移的方法来进行平行三度和平行六度之间的切换，效果也很好。&lt;br /&gt;11、三全音（增四度）尽量要避免，除非是属七和弦的完全终止。&lt;br /&gt;12、 一个声部奏持续音，另一个声部奏旋律效果很好，但是要注意持续音的选择，以及旋律不要和持续音产生和弦冲突。&lt;br /&gt;13、低音可以以伴奏的姿态出现，奏 阿尔贝提低音。这时写作和钢琴曲的写作差不多一样。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;&lt;br /&gt;最后说一下和声。&lt;br /&gt;这里建议大家找一本和 声学的著作来看，因为我毕竟刚学和声不久。我说能告诫大家的，就是以下的几个&amp;#8220;禁忌&amp;#8221;的连接：&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;1、V-IV：这是一个著名的禁忌，叫&amp;#8220;异音进行&amp;#8221;，因 为两个和弦没有共同的音。在大调中，有一个允许的特例，就是V-IV-V，但是小调中要尽量避免。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;2、II-I：另一种形式的异音进行，不可。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;注：现在说一下为什么&lt;span&gt;V-IV或II-I不 可，而IV-V或I-II却可以。I是最重要的和弦，&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;因此可以进行到任何一个和弦；&lt;span&gt;V虽然不是 I，但是其重要性仅次于I，IV有是主三和弦（这个是相对于副三和弦说的），所以也可以。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;3、VI-I;&amp;nbsp;III-V;&amp;nbsp;II-IV：以上三对和 弦称作同系和弦，其中I，V，IV是主三和弦，VI，III，II是副三和弦。同系和弦从主到副是正当，从副到正是不良。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 9pt;"&gt;4、III少用，小调不用。&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 9pt;"&gt;最后补充一点：低音一定要选择好，这点至关重要。好的低音甚至可以弥补旋律的不足。 尤其是主和弦与副和弦交错的时候，更是如此。另外重要的一点是选择好转位，因为一般来说一种情况只有一个转位是最合适的。&lt;/span&gt;&lt;img src="http://www.cnblogs.com/Henrya2/aggbug/1670679.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Henrya2/archive/2010/02/21/1670679.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/01/30/1660257.html</id><title type="text">搜集的优良OpenGL教程 (转载）</title><summary type="text">1.DancingWind  NEHE中文教程  NEHE是十分不错的opengl教程，由浅入深，配合实例讲解。而DancingWind本着一颗分享的心，制成中文版。看官不必一课一课按顺序看但每 一课都应该认真看，中文苦手者可配合英文版观 看&amp;#8230;&amp;#8230;各位可以在他网站下 载，或者告诉我（zwqxin.com） 以代其传给你（汗）。此外DancingWind还整合了几种OPENGL...</summary><published>2010-01-30T14:47:00Z</published><updated>2010-01-30T14:47:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/01/30/1660257.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/01/30/1660257.html"/></entry><entry><id>http://www.cnblogs.com/Henrya2/archive/2010/01/30/1660255.html</id><title type="text">OpenGL教程 &amp;quot;Top Ten&amp;quot; (转载）</title><summary type="text">因为工作的原因，自己现在也没有太多时间专注于游戏开发。这里将以前收集的一些OpenGL教程网站罗列出来，与喜欢OpenGL、游戏开发的朋友一起分 享。当然还有一些好的教程网站没有包含在里面，欢迎大家补充，标题的&amp;#8220;Top  Ten&amp;#8221;也完全是为了吸引大家的眼球。不过我想对于大多数人包括我自己来说，最主要的并不是缺乏学习的资料，而是缺乏一种持之以恒、坚持不懈的精神。1．http:...</summary><published>2010-01-30T14:43:00Z</published><updated>2010-01-30T14:43:00Z</updated><author><name>Henry Read</name><uri>http://www.cnblogs.com/Henrya2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Henrya2/archive/2010/01/30/1660255.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Henrya2/archive/2010/01/30/1660255.html"/></entry></feed>
