<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://eddyzhoufeng.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2feddyzhoufeng.spaces.live.com%2fcategory%2f%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>流　　浪　　的　　枫　　之　　羽: 程序设计</title><description /><link>http://eddyzhoufeng.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%25E7%25A8%258B%25E5%25BA%258F%25E8%25AE%25BE%25E8%25AE%25A1</link><language>en-US</language><pubDate>Tue, 02 Sep 2008 03:49:30 GMT</pubDate><lastBuildDate>Tue, 02 Sep 2008 03:49:30 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://eddyzhoufeng.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-2510522667657978555</live:id><live:alias>eddyzhoufeng</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>About Join in Open Source SoftWare Project</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!818.entry</link><description>&lt;p&gt;确实每个开源项目对于你所拥有的能力都没有任何要求，由于项目是有分工的，所以有很多的工作需要人来做。这样，对于不同能力的人自然会有不同的可以胜任的工作。你是一个初学者，当然有初学者可以胜任的工作。例如，项目周边的事情，更新各种项目的数据，负责简单的答疑等等。如果，你想加入进开源项目，自然应该从这里做起，慢慢熟悉项目。当你熟悉项目后，自然就比其他人有更多的优势来参与近开发工作，这时你想升级为开发人员就自然容易很多。我也清楚有很多的初学者加入前都会说：”我是初学者，可能帮不上什么忙？“但是，这恰恰错了，你是初学者那么自然就不会有很难的任务给你，因为这样的话项目就停滞了，谁也不会那么做，你自己也不愿意承担。关键点：在于你自己。加入项目后，由于各自都各自的想法或者工作，所以没有人来过问你。但是，你却可以自由的根据自己的能力来提问，而且在项目中，应该会有很多相应的文档可以浏览，或者别人的讨论可以看到，这时你就可以更加轻易的理解项目，关键点在于你自 己，是否上心，只要稍微有心就可以负责某些工作，再稍微用点心，你就会发现自己可以编写某些方面的代码。当你真的有心的话，你就可以融入项目中，这时谁也不会在意你的能力，而且项目离开了你就是一种损失，因为某些方面的工作没有人来做了。大家在同一个项目中的主要目的是为了让项目成功，对于学习大家都是赞同的，因为只有学习了，才可能更加有助于为项目的成功出力，而且谁都需要学习。但是，如果你只是学习，这里的学习仅仅是......怎么表达呢？在一旁看？或者只是询问别人某些事情？我想那根本不是学习，那只是你自己的一种幻觉，因为你根本没有学习到什么东西。你从不动手，你从不想去如何解决某些问题，你又不负责项目的任何工作，你 只是看？那和一个普通的旁人有什么区别呢？你高兴了可以来看看，不高兴就放在一边，这样也能叫做学习？再说，你没有付给任何人工资，别人又怎么能主动的来教你什么呢？所以，在开源项目中的学习就是实际的动手，实际的讨论，实际的负责，不断的在实践中学习到各种知识。
&lt;p&gt;上面谈了这么多，不清楚对于初学者有没有帮助认识开源项目。
&lt;p&gt;也许对于初学者来说，更加注重的是得到了什么，对于自己的付出并不在意，而开源项目似乎更加强调你付出了什么。
&lt;p&gt;在我看来，其实这两点都是各自被自身的想法而扩大化了，其实参与一个开源项目，你在付出的同时你肯定得到了相当的知识与经验（这可以说是你人生的资本，如果你能声称你参与了linux内核的编写，相信你的工作之路会十分的顺畅，如果你声称参与了firef ox的编写，我想同样也不坏）；而你在开源项目中，大家在帮助你的同时，也得到了你的帮助。
&lt;p&gt;这样，才是一种正常的良性循环。&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+About+Join+in+Open+Source+SoftWare+Project&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!818.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!818.entry</guid><pubDate>Thu, 06 Dec 2007 04:13:19 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!818/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!818.entry#comment</wfw:comment><dcterms:modified>2007-12-06T04:21:58Z</dcterms:modified></item><item><title>用C#对DBF数据库的操作</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!817.entry</link><description>&lt;div&gt;
&lt;div&gt;现在在弄GIS的问题，需要读取一个dbf文件，查了很多资料原来是fp的数据库文件   &lt;/div&gt;
&lt;div&gt;   下面是所用的代码。都很简单，就是格式上要注意。和用开的查询语句会有很大不同。&lt;/div&gt;
&lt;div&gt;不过好像对于我要用到的没啥帮助！&lt;br&gt;using System;&lt;br&gt;using System.Collections.Generic;&lt;br&gt;using System.ComponentModel;&lt;br&gt;using System.Data;&lt;br&gt;using System.Drawing;&lt;br&gt;using System.Text;&lt;br&gt;using System.Windows.Forms;&lt;br&gt;using System.Data.Odbc;&lt;/div&gt;
&lt;div&gt;namespace readdbf&lt;br&gt;{&lt;br&gt;    public partial class Form1 : Form&lt;br&gt;    {&lt;br&gt;        public Form1()&lt;br&gt;        {&lt;br&gt;            InitializeComponent();&lt;br&gt;        }&lt;/div&gt;
&lt;p&gt;        private void button1_Click(object sender, EventArgs e)&lt;br&gt;        {&lt;br&gt;            System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection();&lt;br&gt;            string table = @&amp;quot;C:\App_Data\cities.dbf&amp;quot;;&lt;br&gt;            string connStr = @&amp;quot;Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=&amp;quot; + table + &amp;quot;;Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO&amp;quot;;
&lt;p&gt;       conn.ConnectionString = connStr;&lt;br&gt;            conn.Open();&lt;br&gt;          //  OdbcCommand cmd = new OdbcCommand();&lt;br&gt;         //   cmd.Connection = conn;&lt;br&gt;         //   string sql = &amp;quot;update &amp;quot; + table + &amp;quot; set NAME='2' &amp;quot;;&lt;br&gt;         //   cmd.CommandText = sql;&lt;br&gt;         //   cmd.CommandType = CommandType.Text;&lt;br&gt;         //   cmd.ExecuteNonQuery();
&lt;p&gt;           string  sql = @&amp;quot;select * from &amp;quot; + table;&lt;br&gt;            OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);&lt;br&gt;            DataTable dt = new DataTable();&lt;br&gt;            da.Fill(dt);&lt;br&gt;            this.dataGridView1.DataSource = dt.DefaultView;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e7%94%a8C%23%e5%af%b9DBF%e6%95%b0%e6%8d%ae%e5%ba%93%e7%9a%84%e6%93%8d%e4%bd%9c&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!817.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!817.entry</guid><pubDate>Wed, 05 Dec 2007 08:50:07 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!817/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!817.entry#comment</wfw:comment><dcterms:modified>2007-12-05T08:50:07Z</dcterms:modified></item><item><title>启动用户实例的进程时出错(Sql Server Exoress)</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!812.entry</link><description>&lt;div&gt;我遇到了一样的问题，参考如下的解决方法。 
&lt;p&gt;引用 
&lt;blockquote&gt;&lt;a href="http://483sr2kpr3b9.spaces.msn.com/blog/cns!325744D898A71289!326.entry"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;启动用户实例的进程时出错&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;
&lt;div&gt;我相信很多人在使用ASP.NET 2.0 + SQL2005 + aspnetdb(MemberShip等功能)时出现这个问题：“由于启动用户实例的进程时出错，导致无法生成 SQL Server 的用户实例。该连接将关闭。”，其英文版本的相同问题的错误信息是：“Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed.”&lt;br&gt;我花了将近3天的时间，终于找到了答案！原来这是微软的bug，并且微软已经承认，详情如下：&lt;a href="http://support.microsoft.com/?id=896613"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://support.microsoft.com/?id=896613&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;出现此错误的条件是：你用过远程桌面连接，并且安装了SQL2005+VS2005，就有很大可能触发这个问题，微软说会在将来的XP SP3里面解决掉这个问题，要想立即解决这个问题，需要交费……  - -6&lt;br&gt;不用理会SB M$，咱们自有土办法来解决，请看如下文章：&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=128707&amp;amp;SiteID=1"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=128707&amp;amp;SiteID=1&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;br&gt;如果你看不懂英文，那么我告诉你我的解决办法：删除C:\Documents and Settings\[USERNAME]\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS目录即可，[USERNAME]是Windows用户名，比如说Administrator&lt;br&gt;综上所述，为了防止大家像我一样郁闷，特将我的经验公开，谢谢捧场~&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e5%90%af%e5%8a%a8%e7%94%a8%e6%88%b7%e5%ae%9e%e4%be%8b%e7%9a%84%e8%bf%9b%e7%a8%8b%e6%97%b6%e5%87%ba%e9%94%99(Sql+Server+Exoress)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!812.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!812.entry</guid><pubDate>Fri, 30 Nov 2007 06:31:34 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!812/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!812.entry#comment</wfw:comment><dcterms:modified>2007-11-30T06:31:34Z</dcterms:modified></item><item><title>DBF文件格式</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!811.entry</link><description>&lt;div&gt;
&lt;p&gt;1.文件头（32字节）   &lt;br&gt;   0    文件类型     &lt;br&gt;   0x02FoxBASE     &lt;br&gt;   0x03FoxBASE+/dBASE    III    PLUS，无备注     &lt;br&gt;   0x30Visual    FoxPro     &lt;br&gt;   0x43dBASE    IV    SQL    表文件，无备注     &lt;br&gt;   0x63dBASE    IV    SQL    系统文件，无备注     &lt;br&gt;   0x83FoxBASE+/dBASE    III    PLUS，有备注     &lt;br&gt;   0x8BdBASE    IV    有备注     &lt;br&gt;   0xCBdBASE    IV    SQL    表文件，有备注     &lt;br&gt;   0xF5FoxPro    2.x（或更早版本）有备注     &lt;br&gt;   0xFBFoxBASE     &lt;br&gt;   1    -    3    最近一次更新的时间（YYMMDD）     &lt;br&gt;   4    -    7    文件中的记录数目     &lt;br&gt;   8    -    9    第一个数据记录的位置     &lt;br&gt;   10    -    11    每个数据记录的长度（包括删除标记）     &lt;br&gt;   12    -    27    保留     &lt;br&gt;   28    表的标记    0x01具有    .cdx    结构的文件     &lt;br&gt;   0x02文件包含备注。     &lt;br&gt;   0x04文件是数据库（.dbc）     &lt;br&gt;   29    代码页标记   &lt;br&gt;   30    -    31    保留，包含    0x00     &lt;br&gt;   32    -    n    字段子记录     &lt;br&gt;   字段的数目决定了字段子记录的数目。表中每个字段都对应一个字段子记录。     &lt;br&gt;   n+1    头记录终止符（0x0D），n+2    到    n+264    此范围内的    263    个字节包含后链信息（相关数据库    (.dbc)    的相对路径）。如果第一个字节为    0x00，则该文件不与数据库关联。因此数据库文件本身总是包含    0x00。   &lt;br&gt;    &lt;br&gt;   2.字段描述结构（32字节）   &lt;br&gt;    &lt;br&gt;   字节    说明    备注   &lt;br&gt;   0    -    10    字段名（最多    10    个字符    -若少于    10    则用空字符    (0x00)    填充）   &lt;br&gt;   11    字段类型     &lt;br&gt;   12    -    15    记录中该字段的偏移量     &lt;br&gt;   16    字段长度（以字节为单位）     &lt;br&gt;   17    小数位数     &lt;br&gt;   18    字段标记   &lt;br&gt;   0x01系统列（用户不可见）   &lt;br&gt;   0x02可存储    null    值的列     &lt;br&gt;   0x04二进制列（只适于字符型和备注型）   &lt;br&gt;   19    -    32    保留   
&lt;p&gt;————————————————————————————
&lt;p&gt;dbf文件头结构和字段类型描述结构用C语言表示如下：   &lt;br&gt;    &lt;br&gt;   struct    dbf_head     &lt;br&gt;    &lt;br&gt;   {    /*    DBF文件头结构    */   &lt;br&gt;   char    vers;    /*    版本标志*/   &lt;br&gt;   unsigned    char    yy,mm,dd;    /*    最后更新年、月、日    */   &lt;br&gt;   unsigned    long    no_recs;    /*    文件包含的总记录数    */   &lt;br&gt;   unsigned    short    head_len,rec_len;    /*    文件头长度，记录长度    */   &lt;br&gt;   char    reserved[20];    /*    保留    */   &lt;br&gt;   };   &lt;br&gt;   struct    field_element   &lt;br&gt;    &lt;br&gt;   {    /*    字段描述结构    */   &lt;br&gt;   char    field_name[11];    /*    字段名称    */   &lt;br&gt;   char    field_type;    /*    字段类型    */   &lt;br&gt;   unsigned    long    offset;    /*    偏移量    */   &lt;br&gt;   unsigned    char    field_length;    /*    字段长度    */   &lt;br&gt;   unsigned    char    field_decimal;    /*    浮点数整数部分长度    */   &lt;br&gt;   char    reserved1[2];    /*    保留    */   &lt;br&gt;   char    dbaseiv_id;    /*    dBASE    IV    work    area    id    */   &lt;br&gt;   char    reserved2[10];    /*   &lt;br&gt;   char    production_index;     &lt;br&gt;   };   &lt;br&gt;    &lt;br&gt;    &lt;br&gt;    &lt;br&gt;    &lt;br&gt;   //    参考2   &lt;br&gt;   dbf    file    structure   &lt;br&gt;   ~~~~~~~~~~~~~~~~~~   &lt;br&gt;    &lt;br&gt;   bytes    description   &lt;br&gt;   00          foxbase+,    foxpro,    dbaseiii+,    dbaseiv,    no    memo    -    0x03   &lt;br&gt;   foxbase+,    dbaseiii+    with    memo    -    0x83   &lt;br&gt;           foxpro    with    memo    -    0xf5   &lt;br&gt;           dbaseiv    with    memo    -    0x8b   &lt;br&gt;           dbaseiv    with    sql    table    -    0x8e   &lt;br&gt;    &lt;br&gt;   01-03    last    update,    format    yyyymmdd    **correction:    it    is    yymmdd**   &lt;br&gt;   04-07          number    of    records    in    file    (32-bit    number)   &lt;br&gt;   08-09          number    of    bytes    in    header    (16-bit    number)   &lt;br&gt;   10-11          number    of    bytes    in    record    (16-bit    number)   &lt;br&gt;   12-13          reserved,    fill    with    0x00   &lt;br&gt;   14          dbaseiv    flag,    incomplete    transaction   &lt;br&gt;   begin    transaction    sets    it    to    0x01   &lt;br&gt;           end    transaction    or    rollback    reset    it    to    0x00   &lt;br&gt;    &lt;br&gt;   15    encryption    flag,    encrypted    0x01    else    0x00   &lt;br&gt;   changing    the    flag    does    not    encrypt    or    decrypt    the    records   &lt;br&gt;    &lt;br&gt;   16-27    dbaseiv    multi-user    environment    use   &lt;br&gt;   28          production    index    exists    -    0x01    else    0x00   &lt;br&gt;   29          dbaseiv    language    driver    id   &lt;br&gt;   30-31    reserved    fill    with    0x00   &lt;br&gt;   32-n          field    descriptor    array   &lt;br&gt;   n+1          header    record    terminator    -    0x0d   &lt;br&gt;    &lt;br&gt;   field    descriptor    array    table   &lt;br&gt;   bytes    description   &lt;br&gt;   0-10    field    name    ascii    padded    with    0x00   &lt;br&gt;   11          field    type    identifier    (see    table)   &lt;br&gt;   12-15          displacement    of    field    in    record   &lt;br&gt;   16          field    length    in    bytes   &lt;br&gt;   17          field    decimal    places   &lt;br&gt;   18-19          reserved   &lt;br&gt;   20          dbaseiv    work    area    id   &lt;br&gt;   21-30          reserved   &lt;br&gt;   31            field    is    part    of    production    index    -    0x01    else    0x00   &lt;br&gt;    &lt;br&gt;   field    identifier    table   &lt;br&gt;   ascii    description   &lt;br&gt;   c    character   &lt;br&gt;   d    date,    format    yyyymmdd   &lt;br&gt;   f    floating    point   &lt;br&gt;   g    general    -    foxpro    addition   &lt;br&gt;   l    logical,    t:t,f:f,y:y,n:n,?-not    initialized   &lt;br&gt;   m    memo    (stored    as    10    digits    representing    the    dbt    block    number)   &lt;br&gt;   n    numeric   &lt;br&gt;   p    picture    -    foxpro    addition   &lt;br&gt;    &lt;br&gt;   note    all    dbf    field    records    begin    with    a    deleted    flag    field.   &lt;br&gt;   if    record    is    deleted    -    0x2a    (asterisk)    else    0x20    (space)   &lt;br&gt;   end    of    file    is    marked    with    0x1a  &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+DBF%e6%96%87%e4%bb%b6%e6%a0%bc%e5%bc%8f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!811.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!811.entry</guid><pubDate>Fri, 30 Nov 2007 04:52:54 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!811/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!811.entry#comment</wfw:comment><dcterms:modified>2007-11-30T04:52:54Z</dcterms:modified></item><item><title>进程、程序、线程的概念</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!805.entry</link><description>&lt;div&gt;
&lt;p style="margin-left:0px"&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:9pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:9pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:9pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:9pt"&gt;&lt;/font&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:0px"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="楷体_GB2312"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:0px"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="楷体_GB2312"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:0px"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;font style="font-size:14pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:0px"&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:14pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="黑体"&gt;&lt;font style="font-size:14pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:14pt"&gt;&lt;/font&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:0px"&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="楷体_GB2312"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="楷体_GB2312"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="楷体_GB2312"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:0px"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;    在这里我们讨论一下进程、程序、线程的概念：&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;进程通常被定义为一个正在运行的程序的实例。简单来说，磁盘上的可执行文件被载入内&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;存执行之后，就变成“进程”了。在&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt; SDK&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt; 文档中有关于进程的更精确的描述：&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;“进程是一个正在运行的程序，它拥有自己的虚拟地址空间，拥有自己的代码、数据和其他系统资源，如进程创建的文件、管道、同步对象等。一个进程也包含了一个或者多个运行在此进程内的线程。”&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;虽然程序和进程在表面上很相似，但是它们有着根本的区别。程序是一连串静态的指令，而进程是一个容器，它包含了一系列运行在这个程序实例上下文中的线程使用的资源。&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;进程是不活泼的。一个进程要完成任何的事情，它必须有一个运行在它的地址空程此线程负责执行该进程地址空间的代码。每个进程至少拥有一个在它的地址空间中运行的线&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;程。对一个不包含任何线程的进程来说，它是没有理由继续存在下去的，系统会自动地销毁此进程和它的地址空间。&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;br&gt;    线程是进程内执行代码的独立实体。没有它，进程中的程序代码是不可能执行的。操作系统创建进程后，会创建一个线程执行进程中的代码。通常我们把这个线程称为该进程的主线程，主线程在运行过程中可能会创建其他线程。一般将主线程创建的线程称为该进程的辅助线程。&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:21px"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:21px"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:20px"&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="楷体_GB2312"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:0px"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;font style="font-size:9pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:21px"&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:9pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:9pt"&gt;&lt;/font&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:0px"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p style="margin-left:21px"&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face=Times-Roman&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="宋体"&gt;&lt;font style="font-size:10.5pt"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e8%bf%9b%e7%a8%8b%e3%80%81%e7%a8%8b%e5%ba%8f%e3%80%81%e7%ba%bf%e7%a8%8b%e7%9a%84%e6%a6%82%e5%bf%b5&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!805.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!805.entry</guid><pubDate>Thu, 15 Nov 2007 07:07:01 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!805/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!805.entry#comment</wfw:comment><dcterms:modified>2007-11-15T07:07:01Z</dcterms:modified></item><item><title>一道笔试题</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!802.entry</link><description>&lt;div&gt;
&lt;div&gt;有下面一段程序：&lt;br&gt;int arr[] = {6,7,8,9,10};&lt;br&gt;int *ptr = arr;&lt;br&gt;*(ptr++)+=123;&lt;br&gt;printf(&amp;quot;%d,%d\n&amp;quot;,*ptr,*(++ptr));&lt;br&gt;&lt;br&gt;最终结果是什么呢？为什么？&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;
&lt;div&gt;8,8  嘛，&lt;br&gt;int arr[] = {6,7,8,9,10};&lt;br&gt;int *ptr = arr;  // ptr 指向6的地址&lt;br&gt;*(ptr++)+=123;   // *ptr 等于 6+123  （其实这是迷惑人一下） ，  ptr 加 1 ，指向 7的地址&lt;br&gt;printf(&amp;quot;%d,%d\n&amp;quot;,*ptr,*(++ptr));  //   输出 这里 注意下  先执行 ,*(++ptr)  等于8  ，自加后 ptr 已经指向8的地址 ， *ptr  当然也是8 了&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e4%b8%80%e9%81%93%e7%ac%94%e8%af%95%e9%a2%98&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!802.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!802.entry</guid><pubDate>Sun, 11 Nov 2007 06:51:24 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!802/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!802.entry#comment</wfw:comment><dcterms:modified>2007-11-11T06:51:24Z</dcterms:modified></item><item><title>CString 型和 char* 类型的相互转化</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!800.entry</link><description>&lt;div&gt;&lt;strong&gt;CString 转化成 char* ：强制类型转换为 LPCTSTR；&lt;/strong&gt;
&lt;p&gt;　　这是一种略微硬性的转换，有关“正确”的做法，人们在认识上还存在许多混乱，正确的使用方法有很多，但错误的使用方法可能与正确的使用方法一样多。&lt;br&gt;　　我们首先要了解 CString 是一种很特殊的 C++ 对象，它里面包含了三个值：一个指向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数以及一个缓冲区长度。 有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数（因为字符串结尾有一个NULL字符）。字符记数和缓冲区长度被巧妙隐藏。&lt;br&gt;　　除非你做一些特殊的操作，否则你不可能知道给CString对象分配的缓冲区的长度。这样，即使你获得了该0缓冲的地址，你也无法更改其中的内容，不能截短字符串，也 绝对没有办法加长它的内容，否则第一时间就会看到溢出。&lt;br&gt;　　LPCTSTR 操作符（或者更明确地说就是 TCHAR * 操作符）在 CString 类中被重载了，该操作符的定义是返回缓冲区的地址，因此，如果你需要一个指向 CString 的 字符串指针的话，可以这样做：
&lt;p&gt;&lt;br&gt;CString s(&amp;quot;GrayCat&amp;quot;);&lt;br&gt;LPCTSTR p = s;&lt;br&gt;　　它可以正确地运行。这是由C语言的强制类型转化规则实现的。当需要强制类型转化时，C++规测容许这种选择。比如，你可以将（浮点数）定义为将某个复数 （有一对浮点数）进行强制类型转换后只返回该复数的第一个浮点数（也就是其实部）。可以象下面这样：
&lt;p&gt;Complex c(1.2f, 4.8f);&lt;br&gt;float realpart = c;&lt;br&gt;如果(float)操作符定义正确的话，那么实部的的值应该是1.2。&lt;br&gt;　　这种强制转化适合所有这种情况，例如，任何带有 LPCTSTR 类型参数的函数都会强制执行这种转换。 于是，你可能有这样一个函数（也许在某个你买来的DLL中）：
&lt;p&gt;BOOL DoSomethingCool(LPCTSTR s);&lt;br&gt;你象下面这样调用它：
&lt;p&gt;CString file(&amp;quot;c:\\myfiles\\coolstuff&amp;quot;)&lt;br&gt;BOOL result = DoSomethingCool(file);&lt;br&gt;　　它能正确运行。因为 DoSomethingCool 函数已经说明了需要一个 LPCTSTR 类型的参数，因此 LPCTSTR 被应用于该参数，在 MFC 中就是返回的串地址。
&lt;p&gt;如果你要格式化字符串怎么办呢？
&lt;p&gt;CString graycat(&amp;quot;GrayCat&amp;quot;);&lt;br&gt;CString s;&lt;br&gt;s.Format(&amp;quot;Mew! I love %s&amp;quot;, graycat);&lt;br&gt;　　注意由于在可变参数列表中的值（在函数说明中是以“...”表示的）并没有隐含一个强制类型转换操作符。你会得到什么结果呢？&lt;br&gt;　　一个令人惊讶的结果，我们得到的实际结果串是：
&lt;p&gt;&amp;quot;Mew! I love GrayCat&amp;quot;。&lt;br&gt;　　因为 MFC 的设计者们在设计 CString 数据类型时非常小心， CString 类型表达式求值后指向了字符串，所以这里看不到任何象 Format 或 sprintf 中的强制类型转换，你仍然可以得到正确的行为。描述 CString 的附加数据实际上在 CString 名义地址之后。&lt;br&gt;　　有一件事情你是不能做的，那就是修改字符串。比如，你可能会尝试用“,”代替“.”（不要做这样的，如果你在乎国际化问题，你应该使用十进制转换的 National Language Support 特性，），下面是个简单的例子：
&lt;p&gt;CString v(&amp;quot;1.00&amp;quot;); // 货币金额，两位小数&lt;br&gt;LPCTSTR p = v;&lt;br&gt;p[lstrlen(p) - 3] = '','';&lt;br&gt;　　这时编译器会报错，因为你赋值了一个常量串。如果你做如下尝试，编译器也会错：
&lt;p&gt;strcat(p, &amp;quot;each&amp;quot;);&lt;br&gt;　　因为 strcat 的第一个参数应该是 LPTSTR 类型的数据，而你却给了一个 LPCTSTR。
&lt;p&gt;　　不要试图钻这个错误消息的牛角尖，这只会使你自己陷入麻烦！
&lt;p&gt;　　原因是缓冲有一个计数，它是不可存取的（它位于 CString 地址之下的一个隐藏区域），如果你改变这个串，缓冲中的字符计数不会反映所做的修改。此外，如果字符串长度恰好是该字符串物理限制的长度（梢后还会讲到这个问题），那么扩展该字符串将改写缓冲以外的任何数据，那是你无权进行写操作的内存（不对吗？），你会毁换坏不属于你的内存。这是应用程序真正的死亡处方。&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+CString+%e5%9e%8b%e5%92%8c+char*+%e7%b1%bb%e5%9e%8b%e7%9a%84%e7%9b%b8%e4%ba%92%e8%bd%ac%e5%8c%96&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!800.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!800.entry</guid><pubDate>Fri, 09 Nov 2007 05:44:16 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!800/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!800.entry#comment</wfw:comment><dcterms:modified>2007-11-09T05:44:16Z</dcterms:modified></item><item><title>VS2005中，无法执行添加/移除操作,因为代码元素是只读的</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!799.entry</link><description>&lt;div&gt;
&lt;p&gt;     今天在使用VS2005的过程中，我想为一个EditView添加消息，结果报 代码元素只读，重试了几次，一样的结果，当时有点头昏，重来没有遇到过这种问题，我查看了一下文件的属性，不是只读啊。&lt;br&gt;后来怀疑是VS2005出现了问题，把工程保存了，关闭了VS，然后重新打开项目，再进行操作，没有出现了，^_^&lt;br&gt;问题解决。&lt;br&gt;不知道原因是什么，有点郁闷？？？ &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+VS2005%e4%b8%ad%ef%bc%8c%e6%97%a0%e6%b3%95%e6%89%a7%e8%a1%8c%e6%b7%bb%e5%8a%a0%2f%e7%a7%bb%e9%99%a4%e6%93%8d%e4%bd%9c%2c%e5%9b%a0%e4%b8%ba%e4%bb%a3%e7%a0%81%e5%85%83%e7%b4%a0%e6%98%af%e5%8f%aa%e8%af%bb%e7%9a%84&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!799.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!799.entry</guid><pubDate>Thu, 08 Nov 2007 13:11:38 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!799/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!799.entry#comment</wfw:comment><dcterms:modified>2007-11-08T13:11:38Z</dcterms:modified></item><item><title>在C#中实现Socket端口复用</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!780.entry</link><description>&lt;div&gt;一、什么是端口复用： 　　因为在winsock的实现中，对于服务器的绑定是可以多重绑定的，在确定多重绑定使用谁的时候，根据一条原则是谁的指定最明确则将包递交给谁，而且没有权限之分。这种多重绑定便称之为端口复用。&lt;br&gt;二、我们如何实现Socket端口复用：&lt;br&gt;　　其实我们要实现端口复用很简单，我们只要使用SetSocketOption函数设置Socket选项就可以了。MSDN是这样解释的：&lt;br&gt;Socket 选项确定当前 Socket 的行为。对于具有 Boolean 数据类型的选项，指定非零值可启用该选项，指定零值可禁用该选项。对于具有整数数据类型的选项，指定适当的值。Socket 选项按照协议支持程度来分组。&lt;br&gt;我们来看看这个函数是怎么用的：&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;public void SetSocketOption (&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;    SocketOptionLevel optionLevel,&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;    SocketOptionName optionName,&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;    int optionValue&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;)&lt;br&gt; &lt;br&gt;参数 &lt;br&gt;optionLevel &lt;br&gt;SocketOptionLevel 值之一。 &lt;br&gt;&lt;br&gt;optionName &lt;br&gt;SocketOptionName 值之一。 &lt;br&gt;&lt;br&gt;optionValue &lt;br&gt;该选项的值。 &lt;br&gt;以上参数大家可以去看看MSDN。我这里就不多讲了。&lt;br&gt;在这里我们optionLevel 参数传SocketOptionLevel.Socket；optionName参数传SocketOptionName.ReuseAddress；optionValue参传一个非零值，我传的是True，如果要禁用的话，就传False。&lt;br&gt;如：&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);&lt;br&gt;具体我们看看下面的代码：&lt;br&gt;我们首先建立第一个Socket：&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;        Socket socket1;&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;        IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 20000);&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;        socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;        socket1.Bind(localEP);&lt;br&gt;再建立第二个Socket：&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;        Socket socket2&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;        IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 20000);&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;        socket2= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;        socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);&lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;       //请注意这一句。ReuseAddress选项设置为True将允许将套接字绑定到已在使用中的地址。 &lt;br&gt;&lt;a href="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" target="_blank"&gt;&lt;img height=16 src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" width=11 border=0&gt;&lt;/a&gt;        socket2.Bind(localEP);&lt;br&gt;这样Socket1和Socket2便绑定在同一个端口上了。&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e5%9c%a8C%23%e4%b8%ad%e5%ae%9e%e7%8e%b0Socket%e7%ab%af%e5%8f%a3%e5%a4%8d%e7%94%a8&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!780.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!780.entry</guid><pubDate>Sat, 20 Oct 2007 14:08:40 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!780/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!780.entry#comment</wfw:comment><dcterms:modified>2007-10-20T14:08:40Z</dcterms:modified></item><item><title>介绍本书《Lucene In Action》</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!759.entry</link><description>这本书深入浅出地介绍了Lucene——一个开源的使用Java语言编写的全文搜索引擎开发包。它通过浅显的语言、大量的图注、丰富的代码示例，以及清晰的结构为读者呈现出作为优秀开源项目的Lucene所体现的强大功能。图书馆还有两本可以借哦，大家赶紧！
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e4%bb%8b%e7%bb%8d%e6%9c%ac%e4%b9%a6%e3%80%8aLucene+In+Action%e3%80%8b&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!759.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!759.entry</guid><pubDate>Mon, 15 Oct 2007 01:26:14 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!759/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!759.entry#comment</wfw:comment><dcterms:modified>2007-10-15T01:26:14Z</dcterms:modified></item><item><title>关于google talk</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!756.entry</link><description>&lt;p&gt;看到张磊用的是 google talk, 其實這東西我老早就聽說了, 但是實在是懶得在 QQ与msn 之外再灌一個 im 軟體, 不過 google 這六個字母還是有它的魔力, 所以我想說灌一下玩玩看再移掉就好了, 其他 im 軟體我還真的連灌一下都懶. 其實介面大概跟 google 一貫的簡單風格差不多, 我也比較喜歡這樣, 功能上重點應該是放在跟 gmail 的整合上, 不過就目前 im 的發展跟 gmail 能提供的功能, 這樣的整合並沒有什麼令人驚豔的效果. 我打算移掉了, 等更多朋友轉戰時再轉, 這次的過程讓我最感到驚訝的地方是, 安裝未免也太快了吧?于是乎一宣传，整个实验室都用上了GT!也为GOOGLE做出了贡献！&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e5%85%b3%e4%ba%8egoogle+talk&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!756.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!756.entry</guid><pubDate>Thu, 11 Oct 2007 12:49:05 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!756/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!756.entry#comment</wfw:comment><dcterms:modified>2007-10-11T12:49:05Z</dcterms:modified></item><item><title>连连看核心算法！</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!754.entry</link><description>&lt;div&gt;鉴于有人法mail过来问我连连看的算法，我在这里简单说一下。其实采用的是划线法！还是用具体代码来说明吧，有时候代码胜过语言！&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;/strong&gt; connected&lt;b&gt;&lt;font color="#ff00ff"&gt;(&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color=blue&gt;int&lt;/font&gt;&lt;/b&gt; x1&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color=blue&gt;int&lt;/font&gt;&lt;/b&gt; y1&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color=blue&gt;int&lt;/font&gt;&lt;/b&gt; x2&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color=blue&gt;int&lt;/font&gt;&lt;/b&gt; y2&lt;b&gt;&lt;font color="#ff00ff"&gt;){&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color=blue&gt; &lt;br&gt;    int&lt;/font&gt;&lt;/b&gt; temp&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color=blue&gt;&lt;br&gt;    int&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;    if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; x1&lt;b&gt;&lt;font color="#ff00ff"&gt;&amp;gt;&lt;/font&gt;&lt;/b&gt;x2&lt;b&gt;&lt;font color="#ff00ff"&gt; ) {&lt;/font&gt;&lt;/b&gt; &lt;br&gt;        temp&lt;b&gt;&lt;font color="#ff00ff"&gt; =&lt;/font&gt;&lt;/b&gt; x1&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt; &lt;br&gt;        x1&lt;b&gt;&lt;font color="#ff00ff"&gt; =&lt;/font&gt;&lt;/b&gt; x2&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt; &lt;br&gt;        x2&lt;b&gt;&lt;font color="#ff00ff"&gt; =&lt;/font&gt;&lt;/b&gt; temp&lt;b&gt;&lt;font color="#ff00ff"&gt;; &lt;br&gt;    }&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;    if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; y1&lt;b&gt;&lt;font color="#ff00ff"&gt;&amp;gt;&lt;/font&gt;&lt;/b&gt;y2&lt;b&gt;&lt;font color="#ff00ff"&gt; ) {&lt;/font&gt;&lt;/b&gt; &lt;br&gt;        temp&lt;b&gt;&lt;font color="#ff00ff"&gt; =&lt;/font&gt;&lt;/b&gt; y1&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt; &lt;br&gt;        y1&lt;b&gt;&lt;font color="#ff00ff"&gt; =&lt;/font&gt;&lt;/b&gt; y2&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt; &lt;br&gt;        y2&lt;b&gt;&lt;font color="#ff00ff"&gt; =&lt;/font&gt;&lt;/b&gt; temp&lt;b&gt;&lt;font color="#ff00ff"&gt;; &lt;br&gt;    }&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;    &lt;br&gt;    if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; x1&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;x2&lt;b&gt;&lt;font color="#ff00ff"&gt; &amp;amp;&amp;amp;&lt;/font&gt;&lt;/b&gt; y1&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;y2&lt;b&gt;&lt;font color="#ff00ff"&gt; )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; true&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;    else if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; x1&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;x2&lt;b&gt;&lt;font color="#ff00ff"&gt; ) {&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;        if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; x1&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt;0&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; ||&lt;/font&gt;&lt;/b&gt; x1&lt;b&gt;&lt;font color="#ff00ff"&gt; &amp;gt;&lt;/font&gt;&lt;/b&gt; n&lt;b&gt;&lt;font color="#ff00ff"&gt;)&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; true&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;        for&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;=&lt;/font&gt;&lt;/b&gt;y1&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;&amp;lt;=&lt;/font&gt;&lt;/b&gt;y2&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;++) {&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; x1&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;ax&lt;b&gt;&lt;font color="#ff00ff"&gt; &amp;amp;&amp;amp;&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;ay&lt;b&gt;&lt;font color="#ff00ff"&gt; )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; continue&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; x1&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;bx&lt;b&gt;&lt;font color="#ff00ff"&gt; &amp;amp;&amp;amp;&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;by&lt;b&gt;&lt;font color="#ff00ff"&gt; )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; continue&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;&amp;gt;&lt;/font&gt;&lt;/b&gt;m&lt;b&gt;&lt;font color="#ff00ff"&gt; ||&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt;0&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; continue&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; board&lt;b&gt;&lt;font color="#ff00ff"&gt;[&lt;/font&gt;&lt;/b&gt;x1&lt;b&gt;&lt;font color="#ff00ff"&gt;][&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;]!=&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt;0&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; false&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;; &lt;br&gt;        } &lt;br&gt;    }&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;    else&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;{&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;        if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; y1&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt;0&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; ||&lt;/font&gt;&lt;/b&gt; y1&lt;b&gt;&lt;font color="#ff00ff"&gt; &amp;gt;&lt;/font&gt;&lt;/b&gt; m&lt;b&gt;&lt;font color="#ff00ff"&gt;)&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; true&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;        for&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;=&lt;/font&gt;&lt;/b&gt;x1&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;&amp;lt;=&lt;/font&gt;&lt;/b&gt;x2&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;++) {&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;ax&lt;b&gt;&lt;font color="#ff00ff"&gt; &amp;amp;&amp;amp;&lt;/font&gt;&lt;/b&gt; y1&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;ay&lt;b&gt;&lt;font color="#ff00ff"&gt; )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; continue&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;bx&lt;b&gt;&lt;font color="#ff00ff"&gt; &amp;amp;&amp;amp;&lt;/font&gt;&lt;/b&gt; y1&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;by&lt;b&gt;&lt;font color="#ff00ff"&gt; )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; continue&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;&amp;gt;&lt;/font&gt;&lt;/b&gt;n&lt;b&gt;&lt;font color="#ff00ff"&gt; ||&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt;0&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; continue&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; board&lt;b&gt;&lt;font color="#ff00ff"&gt;[&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;][&lt;/font&gt;&lt;/b&gt;y1&lt;b&gt;&lt;font color="#ff00ff"&gt;]!=&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt;0&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; false&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;; &lt;br&gt;        } &lt;br&gt;    }&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;    return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; true&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;; &lt;br&gt;}&lt;/font&gt;&lt;/b&gt;&lt;font color=green&gt; &lt;br&gt;//水平搜索，沿过a,b的水平平行线搜索。 &lt;br&gt;&lt;/font&gt;&lt;b&gt;&lt;font color=blue&gt;bool&lt;/font&gt;&lt;/b&gt; horizontal&lt;b&gt;&lt;font color="#ff00ff"&gt;(){&lt;/font&gt;&lt;/b&gt;&lt;font color=green&gt; &lt;br&gt;    //平行线重合时&lt;br&gt;&lt;/font&gt;&lt;b&gt;&lt;font color=blue&gt;    int&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;    if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; ax&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;bx&lt;b&gt;&lt;font color="#ff00ff"&gt; ) {&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;        return&lt;/font&gt;&lt;/b&gt; connected&lt;b&gt;&lt;font color="#ff00ff"&gt;(&lt;/font&gt;&lt;/b&gt;ax&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;ay&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;bx&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;by&lt;b&gt;&lt;font color="#ff00ff"&gt;); &lt;br&gt;    }&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;    else&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;{&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;        for&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;=&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt;1&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;&amp;lt;=&lt;/font&gt;&lt;/b&gt;m&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;++) {&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; connected&lt;b&gt;&lt;font color="#ff00ff"&gt;(&lt;/font&gt;&lt;/b&gt;ax&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;bx&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;) )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;                if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; connected&lt;b&gt;&lt;font color="#ff00ff"&gt;(&lt;/font&gt;&lt;/b&gt;ax&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;ax&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;ay&lt;b&gt;&lt;font color="#ff00ff"&gt;) )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;                    if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; connected&lt;b&gt;&lt;font color="#ff00ff"&gt;(&lt;/font&gt;&lt;/b&gt;bx&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;bx&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;by&lt;b&gt;&lt;font color="#ff00ff"&gt;) )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;                        return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; true&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;; &lt;br&gt;        } &lt;br&gt;    }&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;    return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; false&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;; &lt;br&gt;}&lt;/font&gt;&lt;/b&gt;&lt;font color=green&gt; &lt;br&gt;&lt;br&gt;//垂直搜索，沿过a,b的垂直平行线搜索。 &lt;br&gt;&lt;/font&gt;&lt;b&gt;&lt;font color=blue&gt;bool&lt;/font&gt;&lt;/b&gt; vertical&lt;b&gt;&lt;font color="#ff00ff"&gt;(){&lt;/font&gt;&lt;/b&gt;&lt;font color=green&gt; &lt;br&gt;    //平行线重合时&lt;br&gt;&lt;/font&gt;&lt;b&gt;&lt;font color=blue&gt;    int&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt;&lt;br&gt;    if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; ay&lt;b&gt;&lt;font color="#ff00ff"&gt;==&lt;/font&gt;&lt;/b&gt;by&lt;b&gt;&lt;font color="#ff00ff"&gt; ) {&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;        return&lt;/font&gt;&lt;/b&gt; connected&lt;b&gt;&lt;font color="#ff00ff"&gt;(&lt;/font&gt;&lt;/b&gt;ax&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;ay&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;bx&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;by&lt;b&gt;&lt;font color="#ff00ff"&gt;); &lt;br&gt;    }&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;    else&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;{&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;        for&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; i&lt;b&gt;&lt;font color="#ff00ff"&gt;=&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt;1&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;&amp;lt;=&lt;/font&gt;&lt;/b&gt;n&lt;b&gt;&lt;font color="#ff00ff"&gt;;&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;++) {&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;            if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; connected&lt;b&gt;&lt;font color="#ff00ff"&gt;(&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;ay&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;by&lt;b&gt;&lt;font color="#ff00ff"&gt;) )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;                if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; connected&lt;b&gt;&lt;font color="#ff00ff"&gt;(&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;ay&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;ax&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;ay&lt;b&gt;&lt;font color="#ff00ff"&gt;) )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;                    if&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt; (&lt;/font&gt;&lt;/b&gt; connected&lt;b&gt;&lt;font color="#ff00ff"&gt;(&lt;/font&gt;&lt;/b&gt;i&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;by&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;bx&lt;b&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;/b&gt;by&lt;b&gt;&lt;font color="#ff00ff"&gt;) )&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;                        return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; true&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;; &lt;br&gt;        } &lt;br&gt;    }&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color="#0000ff"&gt; &lt;br&gt;    return&lt;/font&gt;&lt;/b&gt;&lt;font color="#cc3300"&gt; false&lt;/font&gt;&lt;b&gt;&lt;font color="#ff00ff"&gt;; &lt;br&gt;}&lt;/font&gt;&lt;/b&gt;&lt;b&gt;&lt;font color=blue&gt; &lt;br&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e8%bf%9e%e8%bf%9e%e7%9c%8b%e6%a0%b8%e5%bf%83%e7%ae%97%e6%b3%95%ef%bc%81&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!754.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!754.entry</guid><pubDate>Wed, 10 Oct 2007 05:43:12 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!754/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!754.entry#comment</wfw:comment><dcterms:modified>2007-10-10T05:43:12Z</dcterms:modified></item><item><title>在云风博客上看到洗牌的随机数生成的问题</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!753.entry</link><description>&lt;div&gt;
&lt;p&gt;我用的方法是先开一个A[N+1]的数组，存的值为rand()以cpu时间戳播种的值（同样也是1-n之间），然后对依照产生的随机数改变所有数字的位置！这样的复杂度为O(N)，效果也不错！
&lt;p&gt;还是直接看代码吧！&lt;/div&gt;
&lt;div&gt;#include &amp;lt;stdio.H&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.H&amp;gt;&lt;br&gt;#include &amp;lt;time.H&amp;gt;&lt;/div&gt;
&lt;div&gt;// 随机数产生类&lt;br&gt;class clRandom&lt;br&gt;{&lt;br&gt;protected:&lt;br&gt; int mRange;  // 随机数的值域&lt;br&gt; int mIndex;  // 取出索引&lt;br&gt; int *mTable; // 随机数表&lt;br&gt; bool mAutoGenerate; // 是否自动产生随机数&lt;/div&gt;
&lt;div&gt;public:&lt;br&gt; // 建构&lt;br&gt; clRandom( unsigned int Range, bool AutoGen = false ) : mRange(Range), &lt;br&gt;  mTable(NULL), &lt;br&gt;  mIndex(0),&lt;br&gt;  mAutoGenerate(AutoGen)&lt;/div&gt;
&lt;div&gt; {&lt;br&gt;  srand( (unsigned)time( NULL ) ); // 使用时间产生随机数.&lt;br&gt;  mRange = Range;&lt;br&gt;  mTable = new int [ mRange ];&lt;br&gt;  Generate();    // 产生随机数.&lt;br&gt; }&lt;/div&gt;
&lt;div&gt; // 析构&lt;br&gt; virtual ~clRandom()&lt;br&gt; {&lt;br&gt;  if ( mTable != NULL ){&lt;br&gt;   delete [] mTable;&lt;br&gt;   mTable = NULL;&lt;br&gt;  }&lt;br&gt;  mRange = 0;&lt;br&gt; }&lt;/div&gt;
&lt;div&gt; // 取出随机数&lt;br&gt; int GetNumber ( void )&lt;br&gt; {&lt;br&gt;  int Number = -1;&lt;/div&gt;
&lt;div&gt;  if ( mRange &amp;gt; 0 )&lt;br&gt;  {&lt;br&gt;   Number = mTable[ mIndex ]; // 取出随机数.&lt;br&gt;   ++mIndex;   // 偏移取出随机数的指针.&lt;br&gt;   if ( mIndex &amp;gt;= mRange ){&lt;br&gt;    mIndex = 0;&lt;br&gt;    if ( mAutoGenerate ){ // 是否重新产生随机数?&lt;br&gt;     Generate(); // 产生随机数.&lt;br&gt;    }&lt;br&gt;   }&lt;br&gt;  }&lt;br&gt;  return Number;&lt;br&gt; }&lt;/div&gt;
&lt;div&gt; // 随机数重整&lt;br&gt; void Generate ( void )&lt;br&gt; {&lt;br&gt;  int loop, Offset;&lt;br&gt;  // 建立连续数字.&lt;br&gt;  for ( loop=0 ; loop&amp;lt;mRange ; loop++ )&lt;br&gt;  {&lt;br&gt;   mTable[ loop ] = loop;&lt;br&gt;  }&lt;br&gt;  // 依照随机数变更数字的位置.&lt;br&gt;  for ( loop=0 ; loop&amp;lt;mRange ; loop++ )&lt;br&gt;  {&lt;br&gt;   int Temp;&lt;br&gt;   // 使用随机数选择要变换的数字.&lt;br&gt;   Offset = (rand()%mRange)+loop;&lt;br&gt;   if ( Offset &amp;gt;= mRange ){&lt;br&gt;    Offset -= mRange;&lt;br&gt;   }&lt;/div&gt;
&lt;div&gt;   // 将数字对调.&lt;br&gt;   Temp = mTable[ loop ];&lt;br&gt;   mTable[ loop ] = mTable[ Offset ];&lt;br&gt;   mTable[ Offset ] = Temp;&lt;br&gt;  }&lt;/div&gt;
&lt;div&gt;  mIndex = 0;&lt;br&gt; }&lt;br&gt;};&lt;/div&gt;
&lt;div&gt;int main()&lt;br&gt;{&lt;br&gt; clRandom *RandMaker;&lt;br&gt; int  loop, Range = 20;&lt;/div&gt;
&lt;div&gt; RandMaker = new clRandom( Range );&lt;/div&gt;
&lt;div&gt; for ( int times=0 ; times&amp;lt;10 ; times++ )&lt;br&gt; {&lt;br&gt;  printf(&amp;quot;第 %d 组\n&amp;quot;, times );&lt;br&gt;  for ( loop=0 ; loop&amp;lt;Range ; loop++ )&lt;br&gt;  {&lt;br&gt;   printf(&amp;quot; %d&amp;quot;, RandMaker-&amp;gt;GetNumber() );&lt;br&gt;  }&lt;br&gt;  printf(&amp;quot;\n\n&amp;quot;);&lt;/div&gt;
&lt;div&gt;  RandMaker-&amp;gt;Generate();&lt;br&gt; }&lt;/div&gt;
&lt;div&gt; return 0;&lt;br&gt;}&lt;/div&gt;
&lt;div&gt;&lt;br&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e5%9c%a8%e4%ba%91%e9%a3%8e%e5%8d%9a%e5%ae%a2%e4%b8%8a%e7%9c%8b%e5%88%b0%e6%b4%97%e7%89%8c%e7%9a%84%e9%9a%8f%e6%9c%ba%e6%95%b0%e7%94%9f%e6%88%90%e7%9a%84%e9%97%ae%e9%a2%98&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!753.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!753.entry</guid><pubDate>Tue, 09 Oct 2007 14:31:22 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!753/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!753.entry#comment</wfw:comment><dcterms:modified>2007-10-09T14:31:22Z</dcterms:modified></item><item><title>放个连连看上来！</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!751.entry</link><description>&lt;div&gt;最近在封装DDRAW，所以作为测试些了个LLK，放在我的E邮！&lt;/div&gt;
&lt;div&gt;还有用这个DDRAW类，重写了一下广为流传的圣剑英雄传！&lt;/div&gt;
&lt;div&gt;图片来自金点工作室！同样放在放在我的E邮！&lt;/div&gt;
&lt;div&gt;&lt;a href="http://free5.ys168.com/?feng5166"&gt;http://free5.ys168.com/?feng5166&lt;/a&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+%e6%94%be%e4%b8%aa%e8%bf%9e%e8%bf%9e%e7%9c%8b%e4%b8%8a%e6%9d%a5%ef%bc%81&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!751.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!751.entry</guid><pubDate>Fri, 05 Oct 2007 14:05:20 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!751/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!751.entry#comment</wfw:comment><dcterms:modified>2007-10-05T14:10:31Z</dcterms:modified></item><item><title>inet_addr函数处理IP地址需要注意的问题</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!747.entry</link><description>&lt;div&gt;
&lt;p&gt;我们有很多的函数来方便地操作 IP 地址。没有 必要用手工计算它们，也没有必要用&amp;quot;&amp;lt;&amp;lt;&amp;quot;操作来储存成长整字型。 
&lt;p&gt;首先，假设你已经有了一个sockaddr_in结构体ina，你有一个IP地址&amp;quot;132.241.5.10&amp;quot; 要储存在其中，你就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下：&lt;br&gt;ina.sin_addr.s_addr = inet_addr(&amp;quot;132.241.5.10&amp;quot;);&lt;br&gt;注意，inet_addr()返回的地址已经是网络字节格式，所以你无需再调用 函数htonl()。&lt;br&gt;我们现在发现上面的代码片断不是十分完整的，因为它没有错误检查。 显而易见，当inet_addr()发生错误时返回-1。记住这些二进制数字？(无符 号数)-1仅仅和IP地址255.255.255.255相符合！这可是广播地址！大错特 错！记住要先进行错误检查。&lt;br&gt;好了，现在你可以将IP地址转换成长整型了。有没有其相反的方法呢？ 它可以将一个in_addr结构体输出成点数格式？这样的话，你就要用到函数 inet_ntoa()(&amp;quot;ntoa&amp;quot;的含义是&amp;quot;network to ascii&amp;quot;)，就像这样： &lt;br&gt;printf(&amp;quot;%s&amp;quot;,inet_ntoa(ina.sin_addr));&lt;br&gt;它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一 个参数，不是长整形。同样需要注意的是它返回的是一个指向一个字符的 指针。&lt;font color="#3300ff"&gt;它是一个由inet_ntoa()控制的静态的固定的指针，所以每次调用 inet_ntoa()，它就将覆盖上次调用时所得的IP地址&lt;/font&gt;。例如：&lt;br&gt;char *a1, *a2;&lt;br&gt;.&lt;br&gt;.&lt;br&gt;a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */&lt;br&gt;a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */&lt;br&gt;printf(&amp;quot;address 1: %s &amp;quot;,a1);&lt;br&gt;printf(&amp;quot;address 2: %s &amp;quot;,a2);&lt;br&gt;输出如下：&lt;br&gt;address 1: 132.241.5.10&lt;br&gt;address 2: 132.241.5.10&lt;br&gt;假如你需要保存这个IP地址，使用strcopy()函数来指向你自己的字符指针。&lt;br&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-2510522667657978555&amp;page=RSS%3a+inet_addr%e5%87%bd%e6%95%b0%e5%a4%84%e7%90%86IP%e5%9c%b0%e5%9d%80%e9%9c%80%e8%a6%81%e6%b3%a8%e6%84%8f%e7%9a%84%e9%97%ae%e9%a2%98&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=eddyzhoufeng.spaces.live.com&amp;amp;GT1=eddyzhoufeng"&gt;</description><comments>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!747.entry#comment</comments><guid isPermaLink="true">http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!747.entry</guid><pubDate>Sun, 23 Sep 2007 08:16:12 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://eddyzhoufeng.spaces.live.com/blog/cns!DD28D4EF61AE1D45!747/comments/feed.rss</wfw:commentRss><wfw:comment>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!747.entry#comment</wfw:comment><dcterms:modified>2007-09-23T08:16:12Z</dcterms:modified></item><item><title>(转)软星七年（上）</title><link>http://eddyzhoufeng.spaces.live.com/Blog/cns!DD28D4EF61AE1D45!744.entry</link><description>&lt;div&gt;软星七年（上） 
&lt;p&gt;
&lt;p&gt;
&lt;p&gt;（《家用电脑与游戏》2007年9期）
&lt;p&gt;&lt;br&gt;　　&lt;br&gt;零、前言
&lt;p&gt;&lt;br&gt;　　2007年8月1日，《仙剑奇侠传四》在大陆和台湾两地同步上市。一周后，寰宇之星向媒体通告，《仙剑四》出货量已经超过20万套。这一数字让开发者上海软星和所有期盼国产单机游戏能够坚守阵地的玩家，都长长地舒了口气。&lt;br&gt;　　然而令所有人意想不到的是，8月6日，上海软星副总经理兼企划总监、《仙剑四》项目总监张毅君（工长君）突然地在“中国仙剑联盟”论坛上发帖，暗示自己将离开软星，离开大宇资讯。他略带伤感地说：“希望继任者再创仙剑辉煌，配得上沧浪剑赋之音乐……”而在此之前，上海软星研发总监、《仙剑四》制作人张孝全（笑犬）也已向台湾总部提出辞呈。若离职申请通过，二人将在今年9月底同时离开大宇。这次离职在外人看来是如此突然，就连上软自己的员工也深感错愕，目前已有数人提出辞呈，若骨干流失，或许我们将很难再看到由大陆制作的《仙剑奇侠传五》。可以说，《仙剑》研发团队正面临着六年来最严重的一次危机。&lt;br&gt;　　七年前的8月，正是北京软星成立之时。这七年仿佛一个轮回，带走了许许多多的人和事。记得四年前《仙剑三》上市之际，网上曾出现过一篇题为《狂徒传说》的文章。作者“历史の道标”在文中披露了大宇早期以及狂徒工作室由盛而衰的秘史，文章写道：“……但游戏却与铸剑之事颇有相似之处。知《仙剑》之名，而不知铸仙剑者何其名。故撰此文，将铸仙剑之人，无论吹风烧火打水之人一一报来。于《仙剑三》荣发之时，行狗仔队之职，以慰读者。 ”这篇文章据说是由前狂徒骨干谢崇辉的内部论坛——“无责任企划的秘密基地”——的访客，集结谢的部分回忆整理而成。自此，姚谢之争成为公开的秘密。&lt;br&gt;　　《狂徒传说》所记多为台湾之事，于2000年姚壮宪转战大陆之后的事情，所述甚少。四年后的今天，值《仙剑四》发售之际，我们特地走访了姚壮宪、张毅君、陈朝勋，以及王世颖、张泽湘和江万江等北京软星和上海软星的元老，同样“行狗仔队之职”，将这七年来发生在大陆软星的故事补完。&lt;br&gt;　　确定这一选题时，上海软星的种种人事变动尚未公开，而此文的目的，也并非“爆内幕”，更非“挑是非”。我们只是希望将七年来大陆软星所经历的风风雨雨尽可能完整地呈现在读者面前，至于中间的是非曲直，既难辨明，也无评判的必要。正如张毅君在评价《狂徒传说》一文时所说：“文章里的那些是是非非有什么意义？玩家只知道自己兴冲冲地跑去买《仙剑二》，买到后却是那样的游戏。不管谁对谁错，玩家的钱是白花了。”&lt;br&gt;　　《仙剑四》发售时，网上曾有玩家以为这是一款网络游戏，这多少让人感到有些唏嘘。五年后，不知道在我们的读者当中，还会有多少人记得软星，记得姚壮宪，记得“狂徒”和“DOMO”？又有多少人会在意大宇的“双剑”是否还有未来、《大富翁》还能出到几代？《集体失忆的黑暗年代》的作者简·雅各布斯说：“我们其实是生活在已消失的原住民文化的坟场中，他们之中的许多文化都是被集体失忆给断然解决掉的；而在那集体失忆的过程中，甚至连丢失了什么内容的这项记忆，也丢失了。”&lt;br&gt;　　软星已是大陆单机游戏研发最后的守望者，我们只希望多年以后，当国产单机游戏从我们的视野中彻底消失时，还会有人想到软星，想到《仙剑》，想起这篇《软星七年》，记得我们曾经拥有过什么，我们为何失去了它们。
&lt;p&gt;&lt;br&gt;壹、《仙四》风波
&lt;p&gt;&lt;br&gt;　　经历了坎坷多事的一年后，上海软星把2005年的研发重心放在了《阿猫阿狗2》和《仙剑奇侠传四》上。这一年，策划将原本就定好的《仙剑四》剧情修改得更为完善，程序也开始学习以往从未接触过的RenderWare引擎。《阿猫阿狗2》完成后，大部分擅长制作RPG的研发人员都被调入《仙剑四》项目，《仙剑四》进入快速研发制作期。&lt;br&gt;　　2007年8月1日，经过两年的辛苦开发，《仙剑四》正式发售。这本是一件值得庆贺的事，没想到好事多磨。上市当日，因认证用户大量涌入，造成认证服务器拥堵，致使玩家无法在第一时间完成游戏的启动认证。好不容易进入游戏，玩家又发现无论机器配置如何，都会出现游戏画面停顿或不流畅的问题。&lt;br&gt;　　“一开始有玩家反映游戏很卡的时候，我们的第一反应是不可能，是不是玩家故意捣蛋？我们用古老的GeForce 3显卡、CPU和内存也都很烂的机器测试过，游戏后期会很卡，可前面根本不会卡。后来玩家的抱怨越来越多，我们才隐约感到糟了，出事了。”&lt;br&gt;　　张毅君立即向寰宇之星催要游戏盘，盘寄到后，公司员工人手一套，开始测试。结果游戏在安装过程中就大量报错，把卡巴斯基和瑞星卡卡卸载后，总算顺利进了游戏，可一玩，发现的确像玩家说的那样，碰到怪卡、杀了怪卡、分经验卡、换场景卡。“我们也没想到StarForce会这么暴力，一看这个样子，顿时浑身冰凉，心想完了完了。”&lt;br&gt;　　张毅君立刻联络台北总部，在《轩辕剑》主程序吴东兴的帮助下，连夜做出了1.1版补丁，第二天就发布出来，大家这才松了口气。&lt;br&gt;　　8月3日，北京举行《仙四》首发签售活动，张毅君如约到场。活动中，一位玩家表示愿意出钱捐助上海软星，支持《仙剑》的研发，被婉拒后，他又热心地说，那我就多买几套仙剑正版吧。张毅君很想上前劝阻，告诉他“赚钱不容易”。回到住处，张毅君打开电脑，登上台湾巴哈姆特游戏网站，发现论坛上一片叫骂，原来台湾那边的《仙剑四》精装版已经上市，但质量很差，香扇折损，攻略掉页，引得玩家纷纷抱怨。“仙剑史上从来没有这么烂的精装版，可以说是旷古绝今。他们不征求也不尊重我们的意见。这么多年来我们这边一直坚持，就是希望把仙剑越做越好，结果那边的一个精装版就搞成这个样子。”张毅君气愤地说，“想想刚才那位玩家的热情，再看看总部的做法，我就对自己说：是时候离开了。”&lt;br&gt;　　谈到离职的原因，张毅君毫不讳言他与台湾总部在对待《仙剑》的理念上的冲突。“准备要离职，我准备了五年，很多时候我都觉得自己受够了。”张毅君觉得这么多年来，总部对上软并没有给予应有的支持，台湾地区的营销很不积极，而更重要的是，尽管《仙剑》系列自三代以后一直是由上海软星独力开发，但上海软星只能拿到大陆地区的销售收入，台湾地区的收入则被总部收走。《仙剑》系列大陆地区的销售套数一般比台湾地区高出四倍，不过由于台湾地区的售价较大陆高，台湾地区的收益往往占到《仙剑》销售总收入的三分之一多。&lt;br&gt;　　《仙剑四》的预期营收为2亿到3亿新台币（约合人民币4500万到7000万元），扣除渠道等成本，它将给大宇带来约1000万人民币的收入，而其中能留在上海软星的大约只有600万人民币。六年前上软开发《仙剑三》时，就是以540万人民币起家，最后几乎陷入弹尽粮绝的地步。这么多年下来，手头还是只有600万，却要去面对《仙剑五》和《仙剑Online II》那样的大作。张毅君认为总公司实际是把《仙剑》的收入挪用到其它项目上，而不顾《仙剑》的未来。“仙剑的水平与国外的差距越来越大，现在次世代游戏也出来了，盗版的环境又没有解决，如果开发经费还是这么多，两年后开发出一个《仙五》，一定会被玩家骂得很惨。所以，我觉得现在离开是一个比较好的抉择。”&lt;br&gt;　　对于昔日战友的离职，姚壮宪并不觉得突然。他理解张毅君的主张，如果上软能够把《仙剑》赚的钱完全留下来，就可以购买更好的3D引擎，招聘更多更优秀的人才，做更多的项目，否则以张毅君的谨慎个性，不会愿意冒险扩张。但他也理解总部的做法，这么多年来大宇一直秉持“中央集权”的财务观念，尽管从法律上说，北京软星和上海软星都是子公司，但它们始终没有独立的财权。总部只是把软星作为其设在大陆地区的研发事业部，而不是独立经营的公司，因此并不要求软星自负盈亏，它们的亏空会由总部填上，多赚的部分也会被总部拿走。&lt;br&gt;　　如今张毅君和张孝全的离职已成定局，上海软星的研发团队是否会就此解体？《仙剑》系列又将何去何从？坐镇北京的姚壮宪并未给出明确答案，他说初步的打算是从上软现有团队中选出新主管，如果找不到合适的人选只好空降。“实在不行，我自己去带。”他半开玩笑地说。&lt;br&gt;　　8月22日，姚壮宪抵达上海，着手处理此事。在他看来，最理想的结果是慰留住大部分骨干，最坏的结果是重组。而进展似乎并不顺利，“浅水留不住大龙。”他叹道。
&lt;p&gt;&lt;br&gt;贰、“燕山”夜谈
&lt;p&gt;&lt;br&gt;　　从张毅君为《仙剑奇侠传四》说明书所写的“前言”中，我们就能清楚地感受到他的这种无奈。他写道：“最近也常常想起电影阿甘无止境的跑步，突然有一天不想跑的感受。但是，每当看到恶意字眼的批评，而非实质性建议的时候，我还是打起最后的精神去微笑面对、认真接受……”&lt;br&gt;　　在最后作出“不想跑”的决定前，不知他是否曾回忆起七年前的那个酷暑，他与姚壮宪一同雄心勃勃地踏上大陆；回忆起北京软星正式开张那天，不慎扭伤了脚的他以伞代拐的趣事；回忆起这么多年来围绕他身边的那些人、那些事。&lt;br&gt;　　陈朝勋是张毅君到大陆后遇见的第一位同事，姚张二人来京之前，陈朝勋刚刚加入大宇，开始组建软星的前期筹备工作。“我想我这辈子都会记得李先生对我的恩情。”谈起七年前与大宇资讯总经理李永进的那场彻夜长谈，他至今感慨不已。&lt;br&gt;　　早在软星成立前两年，陈朝勋就已经在大陆游戏业打拼。1998年2月的某个飘雪之夜，他乘飞机由台北辗转抵达北京，人生第一次踏上大陆。从首都机场出来时，天色已渐黑，北京给他的第一印象是一片灯光辉映中的雪景。那时的他刚刚步入而立之年，被台湾光谱资讯派驻大陆，任北京光谱副总经理。当时的北京光谱刚把组建一年但效果不彰的研发团队裁撤掉，成为一个纯粹的销售办事处，连他在内总共只有8名员工。公司的办公地点在上地，今天的上地已是著名的软件研发基地，而九年前的这里却是一片荒凉，“大中午时，半天看不见一辆车经过，好不容易来了一辆，结果还是驴车。”&lt;br&gt;　　那一年的大陆游戏市场同样凄凉，在经历了两年的短暂繁荣后，第一代游戏拓荒者纷纷折戟沉沙。1998年，先是金盘公司被并入同方光盘股份有限公司，成为清华同方光盘中心的一员，其游戏开发部门被撤掉；然后腾图软件公司解体，解散其游戏制作部门，退出游戏制作领域；6月25日，前导软件公司宣布暂停游戏开发，退出游戏市场。大陆游戏业早期的几面大旗就此倒下，只有金山、目标和尚洋等不多的几家公司仍在坚持。那一年发售的单机游戏，75%的销量均在5000套以下，许多匆匆上马的中小游戏开发商在一两款产品赔钱后即无力维持下去，甚至有些尚未有产品问世时即告解体。在产业的最底层，还有更多原本就没有资金支持的制作组在苦苦挣扎。&lt;br&gt;　　亲身经历了大陆游戏业的惨淡一年后，陈朝勋离开光谱，退出游戏业，找了份“卖杂志”的工作，负责美商BNI集团旗下的《计算机与生活》（eGamer）、《电脑采购》（PC Shopper）和《电脑生活》（PC Life）等杂志的大陆发行业务。2000年3月的某天，公司突然告诉他大宇资讯总经理李永进要来参观，因为他之前有过游戏从业经验，所以被指派负责接待。那天上午，李永进如约而至。在一个多小时的参观过程中，他问得最多的不是BNI的运作情况，而是大陆游戏业的状况。&lt;br&gt;　　令陈朝勋意外的是，当天晚上，他接到了负责大宇商务工作的卓小姐的电话，约他在燕山大酒店一谈。见面后，李永进开门见山地告诉他，大宇希望在大陆成立一家研发子公司，想听听他的意见。陈朝勋就把他在北京光谱工作一年中所了解到的大陆游戏业的情况详细作了介绍，例如版号是什么、申请流程是什么、如何和出版社合作、渠道的铺货方式是什么、能获得的折扣是多少、能获得的结款周期是多长、每个渠道商的行事规则是什么、是否诚实可靠……这些信息对于想进入大陆游戏市场的公司至关重要，却又难以从公开的调研中获得，只有具有实务经验者方能知晓，而在当时的大陆游戏圈中，有实务经验的台湾经理人凤毛麟角。&lt;br&gt;　　两人一直聊到第二天凌晨，最后李永进邀请陈朝勋加入大宇，帮他成立大陆研发公司，而重返游戏业也正是陈朝勋的最大心愿，两人一拍即合。&lt;br&gt;　　2000年6月1日，陈朝勋正式加入大宇资讯，同新招的一名本地员工石爱华一起，开始了北京软星的前期准备工作。之后陈朝勋历任北京软星副总经理、网星史克威尔艾尼克斯公司副总经理、史克威尔艾尼克斯中国公司（SEC）总经理。今年8月15日，北京软星成立七周年之际，他辞去了SEC总经理一职。&lt;br&gt;　　燕山大酒店的这次夜谈，改变了陈朝勋之后七年的职业生涯，也加速了北京软星的诞生。
&lt;p&gt;&lt;br&gt;叁、北软成立
&lt;p&gt;&lt;br&gt;　　陈朝勋加入大宇的半个月后，2000年6月15日，姚壮宪抵达北京，一同前来的还有刚进大宇一年的策划张毅君和负责网络系统的梅期皓。与两年前陈朝勋初临北京时浪漫的雪景不同，他们三人一下飞机，就遭遇了40度的高温。主将就位后，北京软星的组建工作正式开始。三人暂时没有住处，陈朝勋的家就成了临时的指挥中心。&lt;br&gt;　　开公司的第一要事是找一处合适的办公场所，没有办公场所就无法申请营业执照。由于经费有限，他们秉承“一切以节省经费为要”的原则，最后在上地某小区物业办公室找到了一处500平米的闲置场地，可以塞下30多人，而且租金很便宜。2000年7月，姚壮宪、张毅君和陈朝勋等人正式搬进了“新家”——上地南路6号院3号楼二楼。时至今日，这幢大楼外侧涂着的蓝白双色的标志以及“SOFTSTAR”的字样仍然清晰可见。&lt;br&gt;　　公司组建初期，各人的分工很明确。姚壮宪任总经理，负责所有的研发工作。张毅君任策划总监，带领策划团队。陈朝勋为副总，负责所有的后勤工作，从财务、法务到行政。之后不久，陈朝勋把原光谱的美术翟延奇也介绍进来，翟成为北京软星的第一位美术总监。一支小小的研发团队就此成立。&lt;br&gt;　　办公地点有了，接下来的任务就是招人，方法当然也是选择最省钱的——在各大学的BBS和游戏相关网站上刊登招聘启事。《仙剑三》和《仙剑三外传》主策划王世颖就是在那时被招聘进来的，谈起当时的情形，她现在还觉得有些好笑。那天，姚壮宪突然跑到新浪游戏制作论坛上发了个招聘贴，ID是“姚壮宪”三字的台湾拼音，结果被很多坛友认为是骗子。王世颖虽然也怀疑其真实性，但还是回了封信。不久姚壮宪打电话约她出来，一起吃了顿简餐后，她就被录用了。&lt;br&gt;　　借助“大宇资讯”和“姚壮宪”的名气，整个招聘过程很顺利。陈朝勋至今还清晰地记得一位20岁的小伙子大老远从新疆来北京，第一次出远门就坐了50多个小时的火车，他们把他接到公司面试，然后帮他背着行军包到宿舍。当年那个满脸稚气的小伙现在已经声名在外，他就是后来《大富翁六》和《大富翁七》的主策划王麒杰。&lt;br&gt;　　2000年8月14日，领到外商独资企业的营业执照后，软星科技（北京）有限公司正式成立。此时公司已有20多人，到这一年年底，又扩到了近40人。这批早期员工除了王世颖和王麒杰外，还有为软星开发第一款3D引擎“GameBox”的张泽湘、未满18岁就开发过街机游戏的胡颖卓，而美术人员多为没有经验的新手。只要员工对游戏有热情，不论其学历高低，不管其有无游戏制作经验，皆可被吸收——这是从大宇总公司沿袭下来的习惯，北软包括之后的上软，即便是《仙剑》这种名作的开发团队，也往往有三分之二的员工在加入前完全没有任何游戏开发经验。当时姚壮宪还特地从台北总部请来了NPC小组的组长、《明星志愿》系列的制作人廖庄敬，对北软的新晋员工进行培训。&lt;br&gt;　　在王世颖的记忆中，那时公司的办公环境很差，空调是很旧的壁挂机，无时无刻不散发出一股旧空调特有的怪味。“姚仙”虽然有单独的办公室，但整体环境也和大家差不多。就是在这股怪味中，北京软星的第一部作品——《仙剑客栈》诞生了。
&lt;p&gt;&lt;br&gt;肆、为什么是姚壮宪
&lt;p&gt;&lt;br&gt;　　“前面十年我只懂得单打独斗，虽然后面一大帮人在帮我，可我不懂得好好珍惜。现在才知道那个时候很笨，一个人是成不了事的。”姚壮宪离开台北前往大陆，正好是在他加入大宇的十年之后。那时的他习惯扮演“独行侠”的角色，很多东西宁愿一个人想、一个人做。&lt;br&gt;　　1990年加入大宇后，姚壮宪常常以“自由人”的身份出现。最初半年，他在自己家——桃园县工作，虽然自认是大宇的人，却领不到大宇的工资，要靠作品卖出钱获得提成。1989年，他用练了四年的Quick Basic语言和汇编语言，加上在学校写的绘图工具，独自一人完成了《大富翁》一代的开发，这是他交给大宇的第一份“成绩单”。游戏最终在台湾售出3万多套，这在当时是个相当了不起的成绩。1992年，《大富翁二》制作完成，这款游戏从人物原画到地图设计，大部分工作均由姚壮宪独力完成，中间只调用了三个美工帮他制作动画、卡片，以及一些突发事件的小图片。它也是历代《大富翁》游戏中，姚壮宪最喜欢的一代。之后在创作《仙剑奇侠传》的过程中，姚壮宪的个人才能更是得到充分发挥，从剧本到程序、美术、音乐，一切工序都有他的参与，那时他的工作流程是白天写程序，晚上写剧本，半夜画图。1995年7月，《仙剑奇侠传》问世，成为玩家心中的一代经典。&lt;br&gt;　　以姚壮宪为核心的“狂徒创作群”因《仙剑》而声名鹊起，却也因《仙剑》而走向衰微。1996年，《大富翁三》完成后，狂徒开始了《仙剑二》的构想。此时在剧情方面，姚壮宪与狂徒的另一骨干、《仙剑一》的主策划谢崇辉产生了重大分歧。姚壮宪认为《仙剑二》应该讲述一个全新的故事，而谢崇辉则坚持应该延续前作的角色和剧情。这场争执以狂徒的一分为二而告终，姚谢二人各带了七八名成员，分头创作，却又都因人手不够，而无法作出令人满意的东西。这次“分家”令《仙剑二》项目陷入半瘫痪状态，也为日后围绕《仙剑二》的诸多矛盾埋下了伏笔。之后姚壮宪被升为大宇研发部副理，转任行政职务，不再直接参与游戏开发，而谢崇辉也转去做《霹雳奇侠传》，于是《仙剑二》被暂时搁置。&lt;br&gt;　　当时的姚壮宪正值而立之年，同很多步入中年的人一样，也面临着转型的困惑，也对未来的职业生涯感到迷茫。行政职务显然不适合他，“那时候浪费在写报告、写公文、写申请上的时间太多了，一堆公公婆婆，做什么事情都要这个同意、那个同意。我不喜欢绑手绑脚。”这也是姚壮宪选择背井离乡来大陆发展的原因之一。在大陆，除了财权不独立外，做什么游戏、做成什么样、要多少人、做多久，他都可以自己做主，台北虽然也要审核，但通常都会尊重他的意见。&lt;br&gt;　　促使他离开台湾的另一动因是感情的受挫，那一年，相恋三年的女友离他而去，心情沮丧的他一心想换个环境，却又不愿离开大宇。当大陆创业的机会出现时，他便毫不犹豫地抓住了。而公司也需要一员像他这样的大将挑起开疆辟土的重任，李永进说他在大陆考察时，发现“姚壮宪”这个名字在大陆的号召力远比自己强得多。于是，在李永进的充分信任和授权下，大宇的第一家子公司被交到了姚壮宪手上。“李先生是真的想让姚壮宪有一片可以自由挥洒的天空，这也是即便外界诱惑那么多，姚壮宪始终是李先生的忠实伙伴的原因。这种感情，外人很难体会。”陈朝勋回忆说。&lt;br&gt;　　在之后的一次会议上，李永进问有谁愿意跟姚壮宪一起去大陆，结果只有张毅君一个人举手，其他人都沉默不语。对于当时的许多台湾人来说，大陆只存在于历史课和地理课上，他们眼中的大陆，经济落后，气候与生活习惯迥异，文化政治上的差异也很大。而且那时两岸还没有直航，从台北到北京需经由香港转机，加上等机的时间，路上要花12个小时。临走前，总部的同事为他们二人践行。“当时的感觉，就像我们是要去送死。”张毅君笑着说，“不过给我们践行的那些人，两三年后也都过来大陆发展了。”&lt;br&gt;　　就这样，在加入大宇整整十年之后，姚壮宪离开台北，在大陆开始了他的创业之路。在台湾，他只能看到一个游戏从他的手里成长；而在这里，他却可以看到一个公司在他手里成长。
&lt;p&gt;&lt;br&gt;伍、为了梦想，先挖金矿
&lt;p&gt;&lt;br&gt;　　从陈朝勋坐在窗前看着驴车从公司门口慢慢走过，到姚壮宪吃完晚饭穿着拖鞋去给员工找宿舍，这两年间大陆的单机游戏市场出现了回升的势头。所剩不多的几家研发公司，金山、目标、尚洋、逆火、祖龙、创意鹰翔、八爪鱼、金智塔、新瑞狮……仍有新作陆续推出。1999年4月，西山居的《决战朝鲜》上市；9月，尚洋推出国内首款3D游戏《烈火文明》。2000年，目标软件的《傲世三国》成为首款参加E3大展的国产游戏；同年6月，西山居的《剑侠情缘2》发售。尽管本土开发商仍在默默努力，但面对已经开始被大量引入国内的欧美游戏，它们成为配角的命运已无法逆转。张毅君回忆说，他去看过国内的一些工作室，几个年轻人窝在一间三居室或四居室里做开发，很辛苦，又找不到正确的方向。就像以前的他，也做过白手起家的梦。&lt;br&gt;　　姚壮宪的这次大陆创业也算是白手起家，除了不用为资金发愁外，其它一切都需要亲自打理。而他从台湾带来的“财富”只有两样：张毅君、《大富翁》系列的制作权。前者在创业初期为他助了一臂之力，后者则为北软日后的发展奠定了基石。&lt;br&gt;　　众所周知，知名系列的续作一般都有“票房保证”，对于研发团队来说，这意味着一笔稳定而丰厚的“奖金”。大宇早期的研发体系为小组制，每个小组都有固定成员，同做一款游戏，例如大家熟知的DOMO小组、狂徒小组、NPC小组，其“专属”游戏分别为《轩辕剑》、《仙剑》和《大富翁》、《明星志愿》。在现代企业管理中，当有多个项目同时进行时，矩阵结构应该是最佳的组织结构，各项目成员从策划部、程序部和美术部三个部门抽调，随项目的开始与结束而组成和解散。或许是不愿触及小组核心人员的利益，大宇迟迟没有由小组制向“三部分立”制转变。最多的时候，大宇内部甚至有十个小组，七八个人就算一个小组。&lt;br&gt;　　小组制的弊端不仅在于人力资源的浪费，基层研发人员的缺少责任感和积极性，还会在各小组之间造成竞争态势，形成各自为政的格局。当这种竞争涉及知名系列的制作权时，往往会激发诸多矛盾。北京软星成立后，原本集中于台湾总部的三大知名系列，《轩辕剑》仍由DOMO小组负责，《大富翁》由姚壮宪带往大陆，而《仙剑》的归属当时尚未有定论。&lt;br&gt;　　《大富翁》系列是姚壮宪加入大宇后的第一款正式作品，除了《大富翁五》外，之前的几作均由他亲力而为。在某种意义上，姚壮宪对《大富翁》系列的偏爱程度甚至超过了《仙剑奇侠传》。而且当时《大富翁》系列所挣的钱也比《仙剑》系列多，即便比较单款产品，《大富翁四》的销量也要高出《仙剑一》很多。据统计，《大富翁四》在台湾地区的销量为22.6万套，超过《仙剑奇侠传》的16.8万套和《轩辕剑三外传：天之痕》的17.2万套。&lt;br&gt;　　对姚壮宪来说，《大富翁》是一座金矿，《仙剑》是一个梦想。为了梦想，必须先挖金矿。不过当时的他并没有料到，这个梦会做得如此曲折。&lt;br&gt;　　2001年大宇上市，在正规化的管理体制下，原先的研发骨干纷纷脱离一线开发，转成管理人员。由于小组核心出身的技术人员短时间内难以完成部门管理，离开开发核心后的一线团队又面临着很大的压力，因此转型的阵痛在大宇身上表现得尤为剧烈。这也导致之后数年，大宇内部出现不少人事问题。而大陆软星与台北总部之间由于沟通不畅，种种矛盾似乎更易被激化。
&lt;p&gt;&lt;br&gt;陆、第一款游戏，第一部引擎
&lt;p&gt;&lt;br&gt;　　很多人认为大宇不是一家崇尚创新的公司，除了几个经典系列外，近几年鲜有创新之作。这实际是受单机游戏日渐恶劣的市场环境所迫。在发展初期，大宇留给员工的创作自由度很大，开发人员只要提出成熟想法，公司批准后就可以去做，《仙剑奇侠传》就是在这样的自由氛围下创作出来的。姚壮宪此番来大陆创业，也抱着同样的打算。北软的第一款游戏——《仙剑客栈》，就是一次小小的创新。&lt;br&gt;　　那时的北软颇有新人新气象的感觉，姚壮宪鼓励属下自由发挥，包括美术在内的每一位员工都可以提案，策划的创作氛围非常宽松。对于公司的第一款作品，他没有提出具体要求，只是说要做一款《仙剑》的衍生产品，一方面为日后开发《仙剑》系列的正统续作打基础，另一方面也可以借助《仙剑》的名气，为新类型游戏打开局面。&lt;br&gt;　　《仙剑客栈》是一款以《仙剑》为背景的经营策略类游戏，兼有恋爱养成和角色扮演的成分，李逍遥、赵灵儿、林月如和阿奴等大家熟悉的仙剑角色在这家小小的客栈中相聚一堂。《仙剑客栈》的策划只有王世颖一人，程序为胡颖卓和杨毅二人，美术为各项目共用。由于团队中除了王世颖外，其他人都没有多少游戏开发经验，所以项目的整体进度较慢，做了一年时间，于2001年夏季发售。当年在大陆售出6万套，台湾售出1万多套，尽管销量并不理想，但玩家的整体评价不错。有趣的是，《仙剑客栈》是整个《仙剑》系列中，唯一一款在制作人员名单中没有出现“李永进”名字的游戏。姚壮宪解释说：“一开始没规定要放，后来觉得对小李不够尊重，可放哪儿好呢？在台北，他的名字一直是放在‘监制’上的，那样的话，真的监制就没地方放了。后来从电影里学了个头衔叫‘出品人’，这样才算名副其实。”于是，在《仙剑》系列之后的作品中，李永进一直以“出品人”的身份出现在制作人员名单的顶部。&lt;br&gt;　　开发《仙剑客栈》的同时，北京软星还有两个项目在齐头并进，一是姚壮宪领衔的《大富翁六》，二是张毅君领衔的《汉朝与罗马》。为了拥有自己的3D引擎，方便今后的游戏制作，姚壮宪还将曾在上海育碧工作过的张泽湘招至麾下，由他独力挑起3D引擎开发的重任。此时台湾总部的DOMO小组正在加紧《轩辕剑4》的3D引擎的研发，而大陆也已有少数3D游戏问世，如尚洋的《烈火文明》、逆火的《战国：嗜魂之旅》和祖龙的《自由与荣耀》，但效果均不理想。对于软星的第一款3D引擎，姚壮宪没有提出很高的初始需求，并没有要求一开始就做大而全的东西，所以整个开发过程还算顺利，大部分时间都是张泽湘一个人在做，到了后期才又加入两名程序——江万江和原林。两年后，这款被命名为“GameBox”的引擎随《大富翁六》的推出而最终完成，它是软星第一款也是唯一一款自主研发的3D引擎。&lt;br&gt;　　之后根据技术的进步和使用的回馈，GameBox又做过多次重大调整。当时的国产游戏在3D技术的应用上已经有所突破，例如祖龙工作室的即时策略游戏《自由与荣耀2》和第一人称射击游戏《大秦悍将》，以及金山购买LithTech引擎开发的动作游戏《天王》。与这些游戏不同，GameBox在功能上注重强化色彩和形体的处理，加入了增强画面表现力的技术，如全局生成LightMap、柔性皮肤系统、即时粒子系统等，与《仙剑》系列所要表现的唯美柔情风格相契合，因而也就顺理成章地成为了3D化后的第一款《仙剑》游戏的引擎。&lt;br&gt;　　GameBox先后被应用在《大富翁六》、《大富翁六：大家来抢钱》、《仙剑奇侠传三》和《仙剑奇侠传三外传：问情篇》上，2005年的《阿猫阿狗2》所用的引擎也是在GameBox的基础上修改而成的。之后，GameBox引擎终因无人维护而被束之高阁，软星后来开发的《大富翁七》、《大富翁八》和《仙剑四》全部改用大宇总部统一购买的RenderWare引擎。“其实那时候有点贪心，想做自己的3D引擎，后来才发现不现实。3D技术的标准一直在拔高，开发成本也翻了几番，除非你有足够的人力和资金投进去，否则很难赶上。”姚壮宪说。&lt;br&gt;　　外界曾有传闻称大宇“投重资”将3D引擎的研发交给大陆软星，而事实上，GameBox引擎的开发总共只有三人。当年的核心成员张泽湘现就职于腾讯，为腾讯开发一款新的3D引擎；江万江现为北京飞越梦幻科技总经理，开发3D游戏《边缘》；原林现为北京林果日盛科技有限公司副总经理，开发3D游戏《风火之旅》。
&lt;p&gt;&lt;br&gt;柒、分家在八月
&lt;p&gt;&lt;br&gt;　　2001年8月，《仙剑客栈》发售后不久，软星就来了一次大分家。由策划总监张毅君带队，策划王世颖、于大为、宁少华，美术张薇、张天冀，程序房燕良、李华、杨毅，助理李想、蔡纪江，以及网络系统梅期皓，共12人由北京调往上海，成立软星科技（上海）有限公司。原DOMO小组骨干成员、在大宇工作了六年的张孝全，以及DOMO小组的资深程序黄志荣，也在此时由台北加入上海软星，分别担任美术总监和程序总监（黄志荣于数月后离开上软）。当时的北软共30多人，这次分家，除了姚壮宪率领的《大富翁》研发组没动外，另外三个组——王世颖负责的“仙剑客栈”组、张毅君负责的“汉朝与罗马”组和李想负责的“网络三国牌”组的大部分骨干均被调往上海。&lt;br&gt;　　把软星设在北京，这是七年前李永进与陈朝勋的那次夜谈中就已经确定下来的。李永进也考虑过上海，而陈朝勋认为，依据“离原材料近”、“离消费者近”和“离供应商近”三原则，还是北京最为合适。北京高等院校的数量多于上海，软件人才相对集中，2000年的时候还聚集着一批从单机时代走来的游戏开发人员，招聘相对容易。而那时上海的游戏产业尚未成气候，今天的几大网游巨头还在做着其它事情，有的在炒股，有的在做虚拟社区，有的在卖脑白金，有的在卖单机游戏。研发方面，上海尤为薄弱，2000年只有东星、育碧、科乐美等不多的几家以电视游戏开发为主的外资企业。至于上海本地的游戏开发公司，较为正式的只有一家“魔戒工作室”，该小组在2002年初宣告解散。&lt;br&gt;　　既然最初决定设立大陆研发部门时，上海并不在计划之内，那为何要在北软成立短短一年后，就分散开发资源，在上海成立一家新的研发公司？陈朝勋回忆说，当时主要是为了吸纳南方的人才，公司在招聘过程中发现南方人很不愿意到北京工作，上软的成立可以吸引长三角以及更南地区的人才。&lt;br&gt;　　姚壮宪的解释比较个人化，他说其实是因为自己更喜欢上海。上海的气候环境比北京好，生活习惯更接近南方人，而且有台商的圈子。可惜在他来大陆之前，软星设在北京就已成定局，他也只好硬着头皮过来了。不过他并没有放弃去上海发展的念头，所以第二年就让张毅君和张孝全在上海成立了一家新公司。“我