﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-princescar</title><link>http://www.cppblog.com/princescar/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:15:21 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:15:21 GMT</pubDate><ttl>60</ttl><item><title>MFC实训中的一些问题(2)人性化信息提示</title><link>http://www.cppblog.com/princescar/archive/2008/07/14/56127.html</link><dc:creator>斯卡</dc:creator><author>斯卡</author><pubDate>Mon, 14 Jul 2008 12:41:00 GMT</pubDate><guid>http://www.cppblog.com/princescar/archive/2008/07/14/56127.html</guid><wfw:comment>http://www.cppblog.com/princescar/comments/56127.html</wfw:comment><comments>http://www.cppblog.com/princescar/archive/2008/07/14/56127.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/princescar/comments/commentRss/56127.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/princescar/services/trackbacks/56127.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 14pt">一个例子</p>
<p style="FONT-SIZE: 14pt">让我们来假象一个场景：用户正在使用一套类似&#8220;信息管理系统&#8221;的软件，准备新增一条记录，输入完全部的数据后，软件却给出一条错误提示：<o:p></o:p></p>
<p style="FONT-SIZE: 14pt"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<img height=121 alt="" src="http://www.cppblog.com/images/cppblog_com/princescar/1.JPG" width=255 border=0><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><o:p></o:p></p>
<p style="FONT-SIZE: 14pt">用户可能此时已经崩溃在屏幕前了，因为需要输入的记录可能有很多条，这意味着他不得不一项一项检查数据。<o:p></o:p></p>
<p style="FONT-SIZE: 14pt">但换一种场景：用户同样输入完后，软件给出提示：<o:p></o:p></p>
<p style="FONT-SIZE: 14pt"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<img height=145 alt="" src="http://www.cppblog.com/images/cppblog_com/princescar/2.JPG" width=245 border=0><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><o:p></o:p></p>
<p style="FONT-SIZE: 14pt">同时，点击确定后，光标自动跳转到错误的地方，用户只需输入正确的信息就可以了。这样避免了很多额外的工作量，省时省力。<o:p></o:p></p>
<h1>人性化的提示信息<o:p></o:p></h1>
<p style="FONT-SIZE: 14pt">&nbsp; 在我们使用软件时，经常出现一些错误。这时程序可能只是简单地提示&#8220;出错啦！&#8221;，或者给出一大堆错误代码。这经常使初学者很茫然不知所措。如今，软件正越来越朝着人性化的方向发展，如何实现人性化的语言提示，是软件开发中一件至关重要的事。它不仅体现支持与服务的质量、影响产品的销量、更会表现出一家软件公司的风格——我们对用户有无微不至的关怀。<o:p></o:p></p>
<p style="FONT-SIZE: 14pt">人性化提示的重要性不言而喻，它包括的内容也很广泛但要做到人性化提示并不是一件简单的事情，它涉及到数据有效值分析、错误处理、异常抛出、层之间数据传递、程序执行效率分析、人性化语言设计等众多方面方面的内容。<o:p></o:p></p>
<h1>设计与要点<o:p></o:p></h1>
<p style="FONT-SIZE: 14pt">结合近期尝试制作的&#8220;学生信息管理系统&#8221;，在程序人性化信息提示方面，我个人认为需要在开发时做到以下几点：<o:p></o:p></p>
<p style="FONT-SIZE: 14pt">第一，要有严格的数据检查。这是人性化错误提示的基础，连错误都发现不了，就提不上什么人性化错误提示了。首先，要搞清楚各种数据的合法条件；其次，在涉及到数据传递的每个类中加入常规检查函数，保证程序的健壮性，需要特别注意边界值上的问题；最后，一些特殊数据的特殊检查函数，并选择在合适的类中实现，如ID是否重复的检查就应放在链表类中进行。<o:p></o:p></p>
<p style="FONT-SIZE: 14pt">第二，设计错误信息的上抛机制。一旦检查出错误，一定不能直接停止运行，而不管其他的事情。最简单的检查函数返回值会是bool类型，即检查通过与不通过。显然，这样设计的函数无法提供更具体的信息，也就无法进行提示了。个人认为，除非是在UI层的单项检查，否则最好设计返回值为int类型的函数，为了避免混乱，可以使用枚举类型来用ERR_开头的单词代替数字。你也可以直接返回字符串类型的错误信息，但是这样就会有大量的信息在各个层之间不断上抛，会造成程序效率降低。当然，可能另一种更好的错误处理的方式是抛出异常，但对于我们初学者来说，还接触不到这些知识。<o:p></o:p></p>
<p style="FONT-SIZE: 14pt">第三，UI层的呈现方式。错误信息经过层层上抛，终于到达了UI层，此时就要考虑如何去呈现给用户了。一般来说，最常用的方式是弹出对话框，这样做虽然简单，但有时候也不免会出现这样的情况——用户面对点不完的对话框无语了。此时，个人认为有两种处理方式：一种是将所有的错误信息整合后放在一个对话框中弹出，如开篇提到的第二种情景里的；另一种则是直接提示在原对话框上提示，如一般网站才用的方式——在错误的数据后打上*号。这两种方式都有缺点，对于前者，如果错误的数据较多，很可能用户点完确定就忘记哪些信息发现错误；对于后者，可能用户不会在意到错误提示，而且，需要在窗口上添加很多控件。一种比较好的方法是综合两者的优点——弹出错误信息，然后将错误信息整合在UI的ERROR_LIST中。还有一些类似网页形式的提示信息如控件上的Popup Message等，但总体来说，在MFC中实现可能会比较难。<o:p></o:p></p>
<p style="FONT-SIZE: 14pt">另外，提示文字的设计也是一门艺术，它会极大的影响到用户的使用感受，但本文作为技术文档就不涉及此方面的内容了。<o:p></o:p></p>
<h1>总结<o:p></o:p></h1>
<p style="FONT-SIZE: 14pt">要实现人性化的信息提示，需要考虑很多方面问题，虽然实现起来难度要比核心的设计要简单得多，但这确实是软件设计中一个很实际也很有挑战性的问题，它牵涉到用户的使用的方便性与易用性，也遵循了软件开发与服务的根本——&#8220;客户需求&#8221;。<br><o:p><br>这是我在这次中软国际实训中提交的技术文档，各位老鸟看了不要笑，呵呵，欢迎大家评论！</o:p></p>
<img src ="http://www.cppblog.com/princescar/aggbug/56127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/princescar/" target="_blank">斯卡</a> 2008-07-14 20:41 <a href="http://www.cppblog.com/princescar/archive/2008/07/14/56127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC实训中的一些问题记录(1)</title><link>http://www.cppblog.com/princescar/archive/2008/07/12/55960.html</link><dc:creator>斯卡</dc:creator><author>斯卡</author><pubDate>Sat, 12 Jul 2008 07:01:00 GMT</pubDate><guid>http://www.cppblog.com/princescar/archive/2008/07/12/55960.html</guid><wfw:comment>http://www.cppblog.com/princescar/comments/55960.html</wfw:comment><comments>http://www.cppblog.com/princescar/archive/2008/07/12/55960.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/princescar/comments/commentRss/55960.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/princescar/services/trackbacks/55960.html</trackback:ping><description><![CDATA[很难得，我们才大一，就由中软给我们进行暑假实习实训&nbsp;，主讲师周海老师。本人打算做一个简单的学生信息管理系统，今天就一些问题请教了周海老师。<br>
<p><span></p>
<p><span>======================</span><span>未解决</span><span>================================</span></p>
<p><span>-</span><span>如何对数据进行加密（</span><span>HASH\MD5</span><span>）？&#215;</span></p>
<p><span>-</span><span>层层检查数据，如何保证程序的效率？代码的简洁？&#215;</span></p>
<p><span>===================</span><span>解决的问题</span><span>===============================</span></p>
<p><span>-</span><span>如何读写入中文？&#8730;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>写入时不要用</span><span> typeText </span><span>用</span><span> typeBinary</span><span>；</span></p>
<p><span>-</span><span>提示对话框的标题如何更改？&#8730;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>使用</span><span> MessageBox </span><span>代替</span><span> AfxMessageBox</span><span>；</span></p>
<p><span>-</span><span>类原型与实现如何分开？</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>直接分就行，原型放在</span><span> .H </span><span>中，实现放在</span><span> .CPP </span><span>中。另外</span><span> .H </span><span>文件可以不用</span><span> INCLUDE</span><span>，用到的数据类型声明下就行，因为具体实现在</span><span> .CPP </span><span>中，而</span><span> .CPP </span><span>中会</span><span> INCLUDE</span><span>；</span></p>
<p><span>-</span><span>函数全部都在</span><span> CStuMgrDlg </span><span>类中？？？&#8730;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>实际上是</span><span> DEFINE </span><span>的问题，只要防止</span><span> REDIFINE </span><span>就可以了（貌似</span><span> MFC </span><span>自带的有），上网找资料。另外，对于全局用的类的头文件可以放在</span><span> STDAFX.H </span><span>中</span><span> INCLUDE</span><span>；</span></p>
<p><span>-</span><span>长</span><span> ID </span><span>的处理（</span><span>8</span><span>位以上）？&#8730;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>使用结构体封装，维护固定长度的</span><span> int</span><span>；</span></p>
<p><span>-</span><span>数据检查放在何处最佳？或者是层层检查？检查信息如何反馈到</span><span> UI</span><span>？&#8730;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>层层检查，每一层执行自己的特殊检查（如重复</span><span> ID </span><span>的检查要放到链表类中）；</span></p>
<p><span>-</span><span>类的封装与访问产生冲突？&#8730;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>使用内联函数（只有一个</span><span> return </span><span>语句的</span><span> GET </span><span>函数），不比直接访问变量慢；</span></p>
<p><span>-</span><span>如何检查内存泄漏及判定程序运行效率？&#8730;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MFC </span><span>中调试时会自动检测内存泄漏，只要在所有用</span><span> new </span><span>的地方写出对应的</span><span> delete</span><span>；</span></p>
<p><span>-</span><span>如何提高提示语句的人性化？判断函数返回多值？&#8730;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>人性化反馈多使用</span><span> UI </span><span>类中判断语句；对于一些无法在</span><span> UI </span><span>实现的反馈使用函数返回值判断；</span></p>
<p><span>-</span><span>如何打包成独立运行的程序（脱离运行库或者自带运行库）？&#8730;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>新建项目，选择安装包项目，把程序所到的</span><span> DLL </span><span>全部封装进去。用到的</span><span> DLL </span><span>可以在</span><span> DEBUG </span><span>时输出窗口中看到；</span></p>
<p><span>=============================================================</span></span></p>
欢迎大家补充指正！
<img src ="http://www.cppblog.com/princescar/aggbug/55960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/princescar/" target="_blank">斯卡</a> 2008-07-12 15:01 <a href="http://www.cppblog.com/princescar/archive/2008/07/12/55960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CString转换为int, double...</title><link>http://www.cppblog.com/princescar/archive/2008/07/09/55675.html</link><dc:creator>斯卡</dc:creator><author>斯卡</author><pubDate>Tue, 08 Jul 2008 18:54:00 GMT</pubDate><guid>http://www.cppblog.com/princescar/archive/2008/07/09/55675.html</guid><wfw:comment>http://www.cppblog.com/princescar/comments/55675.html</wfw:comment><comments>http://www.cppblog.com/princescar/archive/2008/07/09/55675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/princescar/comments/commentRss/55675.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/princescar/services/trackbacks/55675.html</trackback:ping><description><![CDATA[int: _wtoi(CString*)


long int: _wtol(CString*)


double/float: _wtof(Cstring*)<img src ="http://www.cppblog.com/princescar/aggbug/55675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/princescar/" target="_blank">斯卡</a> 2008-07-09 02:54 <a href="http://www.cppblog.com/princescar/archive/2008/07/09/55675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CS被人2:1-_-|||</title><link>http://www.cppblog.com/princescar/archive/2008/07/06/55474.html</link><dc:creator>斯卡</dc:creator><author>斯卡</author><pubDate>Sun, 06 Jul 2008 09:55:00 GMT</pubDate><guid>http://www.cppblog.com/princescar/archive/2008/07/06/55474.html</guid><wfw:comment>http://www.cppblog.com/princescar/comments/55474.html</wfw:comment><comments>http://www.cppblog.com/princescar/archive/2008/07/06/55474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/princescar/comments/commentRss/55474.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/princescar/services/trackbacks/55474.html</trackback:ping><description><![CDATA[好久不玩 今天居然被人2:1了 还是在我最擅长的BLOODSTRIKE上&#8230;&#8230;<br>好歹当年也是一小狙神&#8230;&#8230;算了，往事不提就此打住，好好学习C++<br><br>-_-|||
<img src ="http://www.cppblog.com/princescar/aggbug/55474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/princescar/" target="_blank">斯卡</a> 2008-07-06 17:55 <a href="http://www.cppblog.com/princescar/archive/2008/07/06/55474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Symbian开源:救赎,反击与未来</title><link>http://www.cppblog.com/princescar/archive/2008/07/04/55363.html</link><dc:creator>斯卡</dc:creator><author>斯卡</author><pubDate>Fri, 04 Jul 2008 10:56:00 GMT</pubDate><guid>http://www.cppblog.com/princescar/archive/2008/07/04/55363.html</guid><wfw:comment>http://www.cppblog.com/princescar/comments/55363.html</wfw:comment><comments>http://www.cppblog.com/princescar/archive/2008/07/04/55363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/princescar/comments/commentRss/55363.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/princescar/services/trackbacks/55363.html</trackback:ping><description><![CDATA[<a href="http://www.cnbeta.com/topic.php?topicid=147"><span id=sign title="NOKIA 诺基亚" style="DISPLAY: inline-block; FILTER: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://www.cnbeta.com/images/topics/Nokia_logo.gif', sizingMethod='scale'); FLOAT: right; WIDTH: 83px; CURSOR: hand; HEIGHT: 55px"></span></a>
<p>最近,NOKIA以超过4亿美元的代价收购了自己主持创建的手机操作系统公司Symbian 52%的剩余股权.消息虽然有些意外,但仔细想想还算在情理之中.毕竟,<span style="FONT-WEIGHT: bold">目前Symbian操作系统最主要的也可以称得上几乎唯一的客户就是持有48%股权的NOKIA,说不清是NOKIA成就了Symbian在智能手机操作系统领域的王者地位,还是Symbian帮助NOKIA在智能手机领域呼风唤雨.因此,从NOKIA的角度自然希望能全部拥有Symbian公司,这样可以避免自己采用其操作系统而将部分费用划归其他股份单位(恰恰还是自己的竞争对手).</span><br><br></p>
<p>整个事件之所以让人关注,并且在多个领域产生重要影响,缘于NOKIA意外地宣布在完成收购之后将Symbian系统以基金会的方式实现开源,并且可能以近乎免费的方式为整个产业提供这个目前为止市场份额最大的智能手机操作系统.虽然有点夸张,不过把Symbian开源比作Windows的开源似乎也不能算太过分,毕竟,2007年Symbian在智能手机操作系统市场占据超过60%的份额.<br>魄力还是阴谋,也许自嘲或者无奈?NOKIA的这一举动让人着实吃惊,诚然开源Symbian也许是NOKIA与其他手机厂商收购股权时为了达成交易而让步的条件,但这一开源的结果却直接影响了多个产业,让曾经雄心勃勃的许多厂商从此陷入迷茫.<br><br style="FONT-WEIGHT: bold"><span style="FONT-WEIGHT: bold">第一部分:完美的战略出击</span><br style="FONT-WEIGHT: bold"><br>如果要评价这一收购的价值,&#8220;NOKIA对Symbian救赎&#8221;也许是最为贴切的评语了.其实,当Google开始展示自己的Android之时,Symbian的发展就已经走到了一个十字路口,是日薄西山还是海阔天空,Symbian必须做出正确的抉择.这次,被收购之后的Symbian选择开源说好听点是NOKIA大发善心,说难听点似乎应是无奈之举,笔者认为,这个事件的背后应该有更深远的意义.<br><br><span style="FONT-WEIGHT: bold">救赎与连消带打</span><br><br>大发善心这个大家都理解,毕竟一个已经相当成熟的手机操作系统开源并且以基金会的形式免费提供,对产业发展有很好的推动作用,而NOKIA看似没有什么收益.说是无奈之举,随着Windows Mobile不断成熟,Palm日益演进,以Linux为基础的手机操作系统也在日趋完善,Symbian的优势可以说完全是依附于NOKIA的强势市场地位而取得的,虽然依然有自己的优势,但优势正在逐渐缩小,特别是随着Iphone将Mac引入手机操作系统,Google也推出Android系统,手机操作系统正在面临空间强大的竞争对手,以Symbian自己的实力,面对这些传统软件巨头,完全没有足够的信心赢得未来的战争(本文将不考虑MTK自己的系统).特别的,Linux系的Android从开始就以完全开源的姿态出现,并且成立了软件联盟来提升自己的竞争力,Mac作为Apple专用系统,依托Apple品牌有自己的空间,而且Apple已经开始接受部分的软件合作,虽然尚且对开放手机操作系统造成冲击,但未来难免不会公开发售.剩下的只有Windows Mobile在保持自己的纯正血统,而Symbian还不具备Windows Mobile与桌面系统的良好兼容性,更为重要的是,微软似乎很愿意赔本赚吆喝,希望逐渐砸出一片天空,就如同在XBOX上的战略一样.可以说短短两年时间,Symbian已经从领导者变成最没有竞争特点的操作系统,生存还是毁灭已经成为摆在Symbian面前的一个迫切的抉择,这一次,NOKIA帮助Symbian建立了最有力的竞争特点——开源.<br><br>相信NOKIA在收购决定做出之前就已经为Symbian铺好了未来发展的坦途,若是从Symbian的角度来看这一选择相当完美.Symbian开源将严重打击手机操作系统市场的竞争对手,至少一个明显的信号是,有心涉及手机操作系统领域的软件公司请停止你们前进的脚步,因为这个领域已经没有金矿可以留给新入者,你很难将产品做得超过即将开源而且完全免费提供,并且开发了10年,交付1亿多套的Symbian.可以说,Symbian的开源将其他企业进入手机操作系统的大门彻底关闭.<br><br>开源,完全可以将Symbian的劣势一下子变成竞争优势.毕竟,Symbian现在还是最为成熟的手机操作系统,对手机硬件来说具有相当出色的友好性,几乎是完全为手机硬件而开发的操作系统.与尚未谋面的Android相比,它已经存在并运营了近十年,与其他Linux系统相比,它更为规范和严格,而这两者之前的优势——开源,现在对Symbian已经不再是个问题.至于其他的几个竞争者,Symbian仅仅开源一项就足以奠定自己的位置,何况Symbian本就市场占统治地位,技术已经足够成熟,用户熟悉度最好,再加上开源和免费提供,这对任何一个手机厂商来说都是不小的诱惑.现在,唯一的疑问就是Symbian究竟选择怎样的路线图来执行开源计划,以及开源的最终程序比例是多少?会不会包括与一些UI和接口的相关代码?<br><br>现在我们还不好评估Symbian对几种操作系统未来的具体影响,不过其中受影响比较大的应该是Windows Mobile和原有Linux基础的各种操作系统,毕竟Mac有自己的苹果粉丝狂热的追捧,Android还没有上市,而且是基于Google的特定平台,未来必然是出来抢市场的,Palm也能固守黑莓这个运营商定制市场的稳定客户群,真正完全商业化的开发操作系统还是之前的两个.Linux基础的操作系统如LiMO等唯一存在的优势对Symbian不再有效,在竞争中本就不占优势的Linux系统估计只有固守日本市场了,连不再强势的Moto都可能放弃应用已久的Linux平台转攻其他平台. Windows Mobile看似市场不会受影响,其实不然.作为最为商业的操作系统,微软恰恰没有任何手机巨头合作伙伴,几乎完全靠着自己的特点赢得客户青睐,但这种青睐本身就很大程度建立在手机与PC的互通性上,而这个又恰恰是微软未来可能失败的伏笔之一(就这个问题,不属于本文的重点,在这里简单解释一下).<br><br>智能手机一个重要的功能是接入互联网服务,因此以PC系统为基础的互联网系统对Windows Mobile来说自然是最为有利的地方.但是,由于脱生于PC系统,Windows Mobile自然有自己的问题,一方面代码相对比较庞大不够简洁,不适合手机硬件的嵌入式处理能力,容易造成速度和功耗的损失.另一方面则是过于亲近PC 架构网络浏览器,对网络数据量需求相对比较大.而这两点恰恰成为Symbian的一个优势,简洁的设计和完全以手机为主的架构,很能适应下一代移动互联网架构的需求.这里涉及到之前ARM与Intel的手机上网之争,ARM处理器作为手机处理器的主体,之所以没有出色的网络浏览表现,核心原因是现在的互联网是基于PC架构的,毕竟PC架构是现在上网的主体,但随着手机上网需求的增加,也许未来移动互联网将专门针对手机设计一种全新的体系架构,以便于手机快速上网,这时,也许对Windows Mobile来说,就可能优势变绊脚石了.据统计,如果按照现在的发展速度,2015年左右,手机上网信息需求量将超越PC,届时整个互联网体系架构很可能向手机浏览倾斜.<br><br><span style="FONT-WEIGHT: bold">也许还是软件的悲哀</span><br><br>虽然只是手机操作系统的开源,但是毕竟是一个很成功的商业软件,可以说Symbian的开源对许多正在和计划从事通用软件开发的企业来说都是个不小的打击.近日与某位嵌入式软件专家就此事件进行探讨,他说曾经有多家企业流露出进军手机软件的浓厚兴趣,如今Symbian的开源可以说基本上断绝了这些企业的宏伟蓝图.操作系统开源之后,许多商业软件的附加价值将降低很多,因为很多免费软件将不断涌入手机之中,这在让手机变得更加灵活的同时,也令众多手机应用软件开发企业失去生存空间.再深入一个层次,Symbian的开源对整个软件产业影响也相当深远,这意味着未来的通用软件开发的生存空间也许变得更加残酷.毕竟当某些公司辛苦得开发出一款很有市场前景的产品之后,忽然之间出现一个完全开源并且免费的竞争者,其打击几乎是致命的.这无疑极大的挫伤了软件企业开发通用软件的积极性,只能在特定用途的软件领域谋求市场,毕竟这是一个开源不太可能实现的领域,而这个领域无论需求量和开发难度都远远不如通用软件值得期待.<br><br>开源正在逐渐成为通用软件的潮流,可以肯定的是,Symbian不会是最后一个开源的大规模应用的通用软件,对于某些制造巨头来说,为了能够统治某个领域,将某些通用软件开源是个不错的想法,这间接的可以实现巨头控制整个产业的野心.可是,对于从事同样软件开发的小公司和新公司来说,这就是一种灭顶之灾.因此,Symbian的开源对软件企业的警示作用是,小心你身边的某个统治性软件的忽然开源,那将彻底断绝你的未来,除非你成为依附于某棵大树的藤条,永远不准备长出自己的树干.<br><br><span style="FONT-WEIGHT: bold">第二部分:对手机产业的影响</span><br><br>Symbian被收购并且开源之后,对整个手机产业将产生新的影响,特别是对智能手机产业来说,意义深远.<br><br><span style="FONT-WEIGHT: bold">硬件厂商很受用</span><br><br>Symbian占据智能手机操作系统的半壁江山,开源之后免费提供的Symbian市场份额将持续增加,这无疑对硬件厂商来说是个好消息.毕竟操作系统与硬件的配合对手机芯片提供商来说非常重要,目前手机核心芯片大多以通用芯片为主,很难对每个操作系统都进行合理的软件开发优化,只能有选择的进行一些设置.而手机操作系统的逐渐增多对硬件厂商来说无疑要适应更多的软件访问差异化设计,这增加了硬件厂商的成本和开发难度.在智能手机逐渐盛行的今天,手机硬件集成度的需求在提升,整合手机硬件与软件的有效协调有助于提升手机芯片提供的整体性能.因此,手机操作系统的集中化可以让手机厂商集中力量对某一种系统进行优化,从而利用软件的优势发挥硬件最大的功效.如果这种系统是开源的,那么硬件厂商获得的发挥空间就更大了,这对手机硬件开发来说是个非常好的信号.关于究竟在提升性能中硬件与软件哪个更重要的问题并不好解释,因为硬件像公路,软件像汽车,如要高速驰骋必须二者协调配合,可以说,从硬件开发角度来说,针对某些特定软件应用进行有效优化的硬件的确可以提升一定的性能表现.<br><br>在操作系统开源之前,手机芯片和操作系统之间的沟通并不密切,虽然ARM和Symbian一直密切合作,但ARM毕竟只提供处理器IP不是最终硬件提供商,操作系统的开源化将打破硬件和操作系统之间的隔阂.由此而来的硬件与操作系统的结合会逐渐融洽,无疑增加了手机开发的发展空间,将让手机有可能以更快的速度更新和发展.参考Windows和Intel的结合,获得了操作系统源代码的硬件厂商将可以根据自己的实际产品设计对操作系统进行个性化设计,有可能以同样的硬件在Symbian系统上提供更多的功能,Symbian基金潜在成员ST就高度评价了这一事件的利好.<br><br><span style="FONT-WEIGHT: bold">设计企业喜忧参半</span><br style="FONT-WEIGHT: bold"><br>手机设计企业对这一事件可以说是喜忧参半,一方面,操作系统的开源为设计企业提供了极大的便利,有助于企业基于特定平台进行更为有针对性的软件开发,从而提升手机的设计的性能,并可以在操作系统的基础上提供更加灵活多样的差异化设计.另一方面,MTK的Turnkey方案给了硬件厂商一个启示,在开源的免费操作系统面前,可能未来的硬件巨头纷纷采用完整解决方案,终端厂商只需要一些简单的外形选择就可以直接从事生产,这无疑就让手机设计企业失去了一些存在的价值,对手机设计产业造成不利的影响.<br><br>从目前看来,手机设计企业还是可以发挥自己的特点,以应用为主导,进行手机差异化的开发设计和多种应用软件的开发,毕竟在一个开发的操作系统平台下,如果能发挥自己在手机硬件设计和软件应用等方面的差异化优势,还是很有机会取得比以前更大的成功的.<br><br>对于手机应用软件开发企业(特别是国内的一些软件企业)来说,Symbian的开源可以说更是喜忧参半.一方面,手机应用软件现在有了一个开发的操作系统支持,软件开发者可以更好的结合操作系统的特点进行应用软件的开发,融洽的软件平台会进一步提升手机应用软件的效果,从而提升产品的竞争力.另一方面,手机操作系统同样对所有人开发,一些小的工作室可以开发出更有针对性更符合用户需求的应用软件,这些免费的软件将对手机应用软件开发企业造成相当大的影响,并且直接降低了手机应用软件开发市场的价值.<br><br><span style="FONT-WEIGHT: bold">智能手机的春天?</span><br><br>对于手机产业来说,Symbian的开源对智能手机是个相当好的消息.一方面硬件的繁荣是个原因,另一方面开源的系统更能体现消费者的需求.毕竟,不管我们的手机采用的是哪种操作系统,只要能实现我们需要的功能就是好的系统.开源的结果会让Symbian拥有更广阔的前景,不仅会有更多人参与操作系统的完善,令操作系统在短时间内得以快速提升性能,而且会让手机软件应用获得空前的发展,让用户获得更多而且是更贴心的应用功能.特别是免费的Symbian还会一定程度上降低手机软件的成本,从而降低手机的成本.这些对用户来说,都不是什么坏消息.对运营商来说,开放的操作系统也可以让运营商更好的设计自己的定制手机服务,通过差异化的软件设计体现运营商的服务理念,从而可以实现对用户的更好服务和实现自己的特别服务.在这种情况下,运营商会加速推广智能手机的进程,从而实现智能手机的快速普及.<br><br><span style="FONT-WEIGHT: bold">手机厂商的迷茫</span><br><br>Symbian的开源从短期看,是对手机厂商不错的消息,毕竟对于Symbian的几个手机制造股东来说,既收获了不菲的金钱,又拥有了免费的手机开放操作系统,这也是几大股东同意此交易的原因.<br><br>对于其他手机厂商来说,Symbian的开源意味着自己可以有免费的操作系统,而且不需要为操作系统投入太多版权费,反而是可以依靠自己的特点优化这个系统并且体现自己的价值,而且还能以此为基础提供一些差异化的软件设计,从而有效提升自己的竞争力.同时,智能手机产业的繁荣和应用的增多也提供给手机厂商更大的发展空间,而且还缩小了各个厂商与NOKIA的竞争差距,提供给他们以迎头赶上的机会.毕竟NOKIA在明,其他厂商在暗,利用一个开放的操作系统平台,各个厂商很可能有机会通过对操作系统之上的应用进行特殊设计实现产品的特殊竞争优势.<br><br>对于中小手机厂商来说,特别是国内的众多手机厂商来说,表面上看开源之后的操作系统是他们进军智能手机产业的良机,之前操作系统的费用问题已经不再存在,而且可以享受操作系统中各大厂商取得的最新进展,这无疑让他们可以有机会取得最为先进的技术,这就拉近了他们产品与最先进厂商产品之间的差距,从而让手机市场的竞争变得更加有机会.但事实往往并非如此简单,一方面,手机操作系统虽然是免费提供,但是申请加入Symbian基金会的条件还未可知,对于国内企业来说能不能获准加入其中也是个问题;另一方面,目前国内手机厂商受上游芯片企业控制比较明显,不容易轻易掌握某些选择的权利,而在智能手机特别是高端市场上,系统整合能力还不强,若是在同一操作平台系统下,自然质量本身与国际巨头可能存在一定的差距,从而明显拉开产品之间的档次差距;此外,我们还必须看到,如果当用户都习惯于使用一种操作系统之后,很难再说服用户更换新的操作系统,正如我们在Windows平台看到的情况类似,如果国内手机厂商不能融入Symbian体系,那么也许在智能手机的竞争中很难获得合适的竞争机会.<br><br>用一句话概括上面这些好处就是,操作系统的开源将有利于产业链各个环节的企业根据具体的应用进行个性化的开发,从而提升自己产品的差异化性能,而在硬件产品越来越同质化的今天,差异化几乎就成为企业产品最突出的竞争优势!<br><br>不过对于手机厂商来说,肯定会对此事产生一个大大的疑问——NOKIA做了这么大一个善事究竟是为什么?NOKIA不可能如此友好的付出4亿美元之后又免费提供这个操作系统,等于NOKIA将自认为价值8亿美元的东西拿出来大家分享,NOKIA究竟意欲何为?<br><br><span style="FONT-WEIGHT: bold">第三部分NOKIA意欲何为和Symbian的未来</span><br><br>那么,NOKIA究竟意欲何为呢?<br><br>首先,如前分析的那样,NOKIA此举是为了拯救Symbian.随着竞争的加剧,Symbian的未来生存已经产生很大的疑问,可以说,在实力雄厚的Windows Mobile和灵活多变的Linux的双重夹击下,Symbian并没有必胜的把握,很可能市场被逐渐蚕食,再加上Mac和PALM,特别是开源的Android的出现,让Symbian面临被淘汰的命运.而开源则解决了Symbian的生存问题,同时连消带打的压制了其他竞争对手.NOKIA为了保持Symbian这个自己的产品,同时不至于自己在未来智能手机操作系统中受制于人,不惜花重金将Symbian拱手让出,借由各大厂商之后为Symbian续命,并且继续扩大自己的优势.同时,NOKIA也会利用自己完全拥有Symbian开发团队这一优势,于现有手中的其他软件部门进行整合,内部向Symbian开放一些UI等更深层次的权限,通过扩大开发平台延伸这个操作系统的控制范围.这样,至少在未来5-10年,NOKIA无须担心手机操作系统的问题.而Symbian在开源之后,凭借广阔的产业链各环节企业和个人爱好者的热情参与,必然重新焕发青春,在诸多有益的修改和大量针对性强的应用软件支持下,可能获得更大的市场份额,并且保持旺盛的活力,甚至发生重大的优化以重新定义智能手机.<br><br>其次,有人认为NOKIA在放弃手机制造,其实恰恰相反.试想,谁对Symbian了解最深?如果Symbian打败了其他操作系统谁最高兴?如果Symbian被大众完全接受,并且获得持续繁荣谁的产品最有优势?这些问题的答案都指向了NOKIA.可以说NOKIA是在以退为进,在以智能手机为主的未来,期望至少保持自己在手机制造市场的市场份额.而且,NOKIA还可以通过自己在未来开源基金会的控制权,分享其他参与者的成果,并且依靠自己手机品牌的优势,逐渐获得更大的竞争优势.至于Symbian,当然会随着更多的智能手机销售不断发展,并且随着帮助NOKIA取得优势而越来越受重视.退一万步,就算NOKIA不再看好手机终端市场,NOKIA也会依靠Symbian系统控制未来的手机服务市场,从中获取更大的利益,不过这将考验NOKIA与运营商之间的利益分配协调能力.<br><br>再次,NOKIA可能希望借开源Symbian统治下一代手机.智能手机虽然刚刚上路,但下一代手机操作系统其实应该出现在各大手机企业路线图上了.Symbian已经有近10年的寿命,需要为其寻找替身成为下一代手机操作系统.Symbian自己没有足够的实力优化自己,那么NOKIA就来开源求助其他厂商,借此发展Symbian的同时希望能彻底扑灭其他操作系统的发展火焰.如果有那么一天Symbian如同Windows在桌面一样的统治力,那么NOKIA若是忽然之间推出全新的一种操作系统,很有可能是基于Symbian之上的升级版(如同VISTA之于XP的变化),届时NOKIA不再将新的系统免费提供,那么一方面短期内其他操作系统很难重启开发流程进行跟进,另一方面,手机厂商不得不掏钱购买操作系统授权,这时的NOKIA也许获得的收益远远高于当初8亿的投入,甚至可能借此将紧紧追赶的对手彻底甩开.这种情况,并不是痴人说梦吧?<br><br>最后,NOKIA希望将Symbian塑造成手机操作系统的核心标准.通过开源吸引巨头们纷纷加入,通过免费进行手机安装量的激增,这无疑让Symbian在短时间内获得巨大膨胀空间.特别是在MID设备前景光明的今天,Symbian实现对移动接入的统治意义重大,未来互联网体系架构很可能不再以PC浏览为主,如果未来真的出现以Symbian浏览架构为主的移动互联网体系,那么NOKIA在这个基础上收获的将是一个更为广阔的施展空间.<br><br>当初Symbian的成立源于NOKIA拒绝与微软的合作,而现在Symbian的开源又是一次对微软产品的打击,很有可能未来NOKIA希望凭借壮大了的Symbian实现微软在PC产业实现的统治.<br><br><span style="FONT-WEIGHT: bold">文/《电子产品世界》</span></p>
<img src ="http://www.cppblog.com/princescar/aggbug/55363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/princescar/" target="_blank">斯卡</a> 2008-07-04 18:56 <a href="http://www.cppblog.com/princescar/archive/2008/07/04/55363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>float与double的区别</title><link>http://www.cppblog.com/princescar/archive/2008/06/20/54062.html</link><dc:creator>斯卡</dc:creator><author>斯卡</author><pubDate>Thu, 19 Jun 2008 16:43:00 GMT</pubDate><guid>http://www.cppblog.com/princescar/archive/2008/06/20/54062.html</guid><wfw:comment>http://www.cppblog.com/princescar/comments/54062.html</wfw:comment><comments>http://www.cppblog.com/princescar/archive/2008/06/20/54062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/princescar/comments/commentRss/54062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/princescar/services/trackbacks/54062.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 14pt">double精度高，有效数字16位，float精度7位。但double消耗内存是float的两倍，并且double的运算速度比float慢得多，所以，能用单精度时不要用双精度，以省内存，加快运算速度。</span></p>
<p style="FONT-SIZE: 10pt"><strong style="COLOR: red; BACKGROUND-COLOR: yellow">单精度浮点数在机内占4个字节，用32位二进制描述。<br>双精度浮点数在机内占8个字节，用64位二进制描述。</strong></p>
<p style="FONT-SIZE: 10pt">浮点数在机内用指数型式表示，分解为：数符，尾数，指数符，指数四部分。 <br>数符占1位二进制，表示数的正负。 <br>指数符占1位二进制，表示指数的正负。 <br>尾数表示浮点数有效数字，0.xxxxxxx,但不存开头的0和点。<br>指数存指数的有效数字。</p>
<p style="FONT-SIZE: 10pt">指数占多少位，尾数占多少位，由计算机系统决定。可能是：<br><span style="COLOR: red; BACKGROUND-COLOR: yellow"><strong>数符加尾数占24位，指数符加指数占8位（float）<br>数符加尾数占48位，指数符加指数占16位（double）</strong></span></p>
<br>关于单精度和双精度：<a href="http://zhidao.baidu.com/question/31172828.html">http://zhidao.baidu.com/question/31172828.html</a> 
<img src ="http://www.cppblog.com/princescar/aggbug/54062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/princescar/" target="_blank">斯卡</a> 2008-06-20 00:43 <a href="http://www.cppblog.com/princescar/archive/2008/06/20/54062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>乘方pow</title><link>http://www.cppblog.com/princescar/archive/2008/06/20/pow.html</link><dc:creator>斯卡</dc:creator><author>斯卡</author><pubDate>Thu, 19 Jun 2008 16:24:00 GMT</pubDate><guid>http://www.cppblog.com/princescar/archive/2008/06/20/pow.html</guid><wfw:comment>http://www.cppblog.com/princescar/comments/54061.html</wfw:comment><comments>http://www.cppblog.com/princescar/archive/2008/06/20/pow.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/princescar/comments/commentRss/54061.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/princescar/services/trackbacks/54061.html</trackback:ping><description><![CDATA[<p dir=ltr style="FONT-SIZE: 10pt; MARGIN-RIGHT: 0px; FONT-FAMILY: courier new">C++中没有乘方符号，需要计算乘方时要用到pow()函数，要注意三点：<br><br>1、#include&lt;cmath&gt;或者#include&lt;math.h&gt;<br><br>2、重载形式：<br><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">float</strong></span> pow&nbsp; (<span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">float</strong></span>, <span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">float</strong></span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cmath中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">float</strong></span> pow&nbsp; (<span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">float</strong></span>, <span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">int</strong></span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//cmath中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">double</strong></span>&nbsp;pow (<span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">double</strong></span>, <span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">double</strong></span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//math.h中<br><br></em>3、pow(x,y)仅在<span style="COLOR: red"><strong style="BACKGROUND-COLOR: yellow">x&nbsp;&gt; 0</strong></span>时返回值<br><br>ps:如果只是想算10的p次方的话，可以使用<a style="COLOR: red" href="http://baike.baidu.com/view/982217.htm" target=_blank><strong><em>double&nbsp;pow10(int)</em></strong></a></p>
<img src ="http://www.cppblog.com/princescar/aggbug/54061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/princescar/" target="_blank">斯卡</a> 2008-06-20 00:24 <a href="http://www.cppblog.com/princescar/archive/2008/06/20/pow.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>