最近忙着看书,但发觉记忆不是很好。看时明明白白的东西,一会就忘了。觉得还是记录下来,好记性不如烂笔头,减慢阅读的速度,增加思考的时间。
More Effective C++之一 基础议题
条款1:区分指针和引用
这个可以理解为:指针和引用有什么区别。
一是指针可以为空,而引用不能为空。
引用必须要指代某个对象。由于引用总是要指代一个对象,C++要求引用必须初始化。不存在空引用,则意味着引用比使用指针更高效。因为使用引用之前不需要测试它是否有效,而指针通常需要检查其是否为空。
二是指针可以被重新赋值用以指向另外一个不同的对象,而引用总是指向初始化时它所指代的对象。
条款2:优先考虑C++风格的类型转换
这个可以有两个问题需要明白:一是C风格的类型转换有什么缺点;二是C++风格的类型转换的优点。
首先我们来看C风格类型转换的缺点:
其一是可以通过它们在任意类型之间进行转换。有些转换差别很大,但C风格的类型没有做区分,行为有些粗鲁。
其二是C风格的类型转换很难进行查找。
c++风格的类型转换:有4种类型转换,分别是static_cast, const_cast, dynamic_cast和reinterpret_cast。
使用时应写成
static_cast<typde> (expression),其他同理。
static_cast 针对一种不涉及继承的类型实施转换,也不涉及const转换的时候,就可以使用static_cast转换。
const_cast用来去除掉一个表达式的const属性或volatile属性。强调的是通过这个转换你要做的唯一一件事情就是改变某些东西的const属性或者volatile属性。目前为止,最通常的用法是去除掉一个对象的const属性。
dynamic_cast,用来针对一个继承体系做向下或者横向的安全转换。用dynamic_cast 把指向基类的指针(或引用)转换成指向派生类或者基类的兄弟类的指针(或引用),而且同时可以知道转换是否成功。空指针或者异常意味着失败。
reinterpret_cast最常见的用法是用来在函数指针之间进行类型转换。这种转换常常是由(编译器的)实现所定义的,致使reinterpret_cast几乎不可移植。对函数指针实施类型转换是不可移植的,而且在某些情况下会产生不正确的。
C++风格的类型转换的优点:有确切的含义并容易识别,他们允许编译器诊断类型转换所产生的错误,不会使这些错误就在不知不觉的情况下被漏掉。
该上班了,其他待续。。。
posted @
2009-09-15 10:27 Sandy 阅读(331) |
评论 (0) |
编辑 收藏
今天遇到了很诡异的问题,最后把症结归到了StretchBlt这里。
尝试了很多方法,最后发现,是图片的大小问题。原图片的大小比较小,而设定图片的宽度和高度时用了很大的值,结果导致StretchBlt失败,从而界面刷新失效。改成较小的值则没有这样的问题。对于这个原因,没有想明白为什么?因为有两个紧挨着的语句都这么调用,在很多机型中都没有问题。但是在特定的机型中就会发生。一次调用成功,两次调用失败。这让人很恼火。
在调试的过程中,设备很容易死机。这么尝试几十次之后,真的有点发疯了。
还好,问题解决了。自己的理由找的也很充分。
但是这对么?
在SDK中,看到有这么一句:
If the source transformation has a rotation or shear, an error occurs. 原图片与设备不相符时,是否会发生剪切的行为呢?我这里只是猜测。
posted @
2009-09-04 18:55 Sandy 阅读(780) |
评论 (0) |
编辑 收藏
我们都知道,在设置中有连接选项,我们可以选择指定的接入点连入网络。但是其原理又是怎样的。这个在我最近的学习中一直找不到很好的解决方案。
人们比较熟悉GPRS连接,中国移动的GPRS接入也不外乎分为两种,cmnet和cmwap。通过枚举接入点,获取接入点名称,然后建立连接。看似还是挺简单的。
但是我们也注意到,在网络中还存在拨号,这个连接是怎么进行的。我这里还没有想明白。
还有如何利用程序自动的选择网络,使其出现在连接设置界面中。好像也还没有人给出答案。为此我还专门跑到MSDN上面去问,不过有人说还没有方法实现。不过我见过一款软件是可以的,但是怎么实现的也不得而知。
所以剩下的工作只能自己努力发现了,还有借助这里的力量了。
如果您有什么建议的话,不妨告诉我。
posted @
2009-09-02 17:54 Sandy 阅读(689) |
评论 (0) |
编辑 收藏
遇到问题的时候,要变换角度看问题,不能只盯着一处。
事情是这样的:我们新发布出去的产品发现了一个BUG,这个问题在测试阶段也遇到过,当时以手机的原因没有理会。但发出去后,发现很多用户使用中也用到了相同的问题。其中也有一款机型我见过。这让我很郁闷。什么原因呢?尝试了用户的操作发现,的确存在这样的问题。
原因还在查找中。所以在遇到问题的时候,一定要多方面的排查问题,不要轻易的将问题放过去。有可能会是一个痛。
生活中也有许多这样的例子吧。所以我们有时没有必要钻牛角尖。
posted @
2009-08-28 16:20 Sandy 阅读(193) |
评论 (0) |
编辑 收藏
最近遇到了一些问题,都是关于Connection Manager的,它的一些API的运用方面的问题。主要纠结在了ConnMgrQueryDetailedStatus函数的使用上。不是很清楚这个已经存在的网络的枚举标准是什么?我应该怎么过滤掉一些无关的连接网络。
网上查阅了一些资料
1、Windows CE Networking Team WebLog 这是网络组的一个博客
ttp://blogs.msdn.com/cenet/archive/tags/Author_3A00_+Adam+Dyba/default.aspx
2、How Connection Manager Connects
http://msdn.microsoft.com/en-us/magazine/dd263096.aspx
他们都对Connection Manager熟悉,但是相关的文章中并没有提及这些。
所以还在寻找中。。。
posted @
2009-08-26 17:48 Sandy 阅读(318) |
评论 (0) |
编辑 收藏
曾记得我记录下来了,现在又找不到了,所以还是记录在博客中,作为我的备份档案。
“没有找到 MSVCR80D.dll,因此这个程序未能启动,重新安装应用程序,可能会修复此问题。”
在VS2005中,经常碰到这个问题,怎么办呢?是去网上下载一个dll么?我没有尝试过。但是网上提供的一种方法是这样的,我觉得挺简便的。
如图:
将"Use FAT32 Work-around" 设为yes就可以了。
posted @
2009-08-24 18:41 Sandy 阅读(814) |
评论 (2) |
编辑 收藏
今天在windows mobile的博客中,看到一篇文章名为“Widget Anatomy- The Manifest”。对于widget是第二次听到,第一次是在一个招聘的要求里看到的。
那么什么是Widget呢?
google了一下,其实还是很糊涂。
在《Widget是什么?》中,作者说“widget"”(和RSS一样,没有中文名的Web 2.0产物):可以是一个图像图像的部件(小插件),也可以是图形背后的一段程序,可以嵌在手机、网页和其他人机交互的界面(例如电脑桌面)上,其目的是:1)帮助用户享用各种应用程序和网络服务(Internet services),2)方便快捷;3)好玩,速度快。
在《什么是widget?widget是什么意思?》文中, Widget-名词—①一个小机械设备,如球形柄或者开关装置,特别是一些没有或者想不起具体名称的物品。Gadget(新奇的小玩意):在仪器板上一排的widgets。②在用户的图形界面上,为了实现一个具体的功能(例如卷轴或者按钮)而使用的系列图形符号和程序代码。③为某项任务特定的设备或者操纵装置--通常提供包含设定模式而行为一致的常用的widgets的widget库。
感觉widget是一个很个性化的东西,或者很小,但是很方便,很好玩。可以好好学习一下。
引用:
1、Widget是什么?
http://blog.vsharing.com/Grigo/A572418.html
2、什么是widget?widget是什么意思?
http://info.codepub.com/2008/06/info-19918.html
3、Widget Anatomy-The Manifest
http://windowsteamblog.com/blogs/windowsphone/archive/2009/08/12/widget-anatomy-the-manifest.aspx
4、Mobile Widget 是什么?
http://www.mtrend.net.cn/bbs/viewthread.php?tid=3351
posted @
2009-08-24 10:42 Sandy 阅读(513) |
评论 (0) |
编辑 收藏
今天看的调试的这一章主要是针对多线程程序的调试。多线程程序运行的不确定性,使其调试起来就像抓蝴蝶一样,你捉摸不透它驻足的位置。
书中给了一些建议和方法:
一是有计划地对付错误。
对应用程序展开适当的调试,应该是远在你使用调试器之前就开始了。多多使用ASSERT调试措施。(ASSERT背后的概念是安全和速度之间的交换。程序运行因此运行得比较慢,但是Debug Build的制造就是为了调试,所以可以理解)在每一个你的假设之处做检验工作。进入一个函数时,确认所有状态。不要只是检查指针是否合法;如果可能,检查一下指针所指的结构中的数据是否一致。
二是Bench Testing
其实这种方法就是先撇开多线程的环境,测试程序逻辑的正确性。如果OK了,然后再考虑与线程相关的东西。
三是线程对话框
这里主要讨论了对一个特定的线程如何调试,方法是挂起所有的线程——除了我们关注的那个。书中介绍的方法在vs 2005我没有找到。
四是日志记录
这里主要是在控制台窗口显示一些运行信息,我们可以使用printf等函数在控制台输出一些信息来查看线程的运行次序。
五是内存记号
使用内存记号的好处就是降低彼此干扰的可能性。但是也要注意它不是同步操作,可能会因为两个线程的同时写入引来问题。
六是硬件调试寄存器
前面的这六种方法我也只用过三种,有一些还真是第一次见到。不过不怕下次搞不定问题的时候可以拿来进行尝试,来抓一抓隐藏在程序中的“臭虫们”。
成功消除多线程程序的“臭虫”,作者说需要具备三种素养:决心、耐心、创造力。同时也不要蛮干,要采用科学的方法:观察、预测、测试。
总结一下:借助方法,观察现象,大胆预测,勇敢尝试,完备测试。
项目中也碰到了多线程的使用。未来可能多线程的使用会越来越多,不能停留在完成功能和任务上,应该多思考多测试。避免多线程的不可确定性带来的一些困扰。
学习书籍:《Win32 多线程程序设计》侯捷译
posted @
2009-08-21 17:19 Sandy 阅读(1782) |
评论 (2) |
编辑 收藏
项目要结项了,自然要进行一些审查的工作。不过我是那个被审查的。审查出的一些问题,还是值得反思的。
一是注释:虽然注释可有可无,但是良好的注释有助于提高代码的可读性。我们写代码的时候,有时候就比较懒,不写注释,或者写大多的注释。有的注释没有及时更新。这些都需要注意。
二是注释掉的代码没有删除。如果少量还好,但是在代码中存在这个问题。可能当时只是在修改BUG时的一个改动,但是修改成功后,应该及时删除这些代码。否则代码不是很美观。
三是一些测试代码依然存在代码中,虽然没有用到,但是让人多了很多迷惑。
四是名字起的不是很规范。
这是审查的那位大师简单一看就提出来的问题。有则改之,无则加勉。多多努力,让自己的代码更加漂亮起来。
posted @
2009-08-20 18:00 Sandy 阅读(137) |
评论 (0) |
编辑 收藏
最近在做项目总结,其中网络部分的处理比较麻烦,以后交接工作也牵涉很多。于是在下了很大决心之下,决定画一些图来理理网络协议的处理。呵呵,主要是对UML画图不是很熟。
最熟悉的UML画图工具是Microsoft Office Visio工具,以前尝试过,但是总觉得不方便。呵呵,没有用惯,自然就抱怨起来了。于是良方吧。
同事有推荐使用Rational的,不过可惜的是没有装成功。
恰逢公司有培训UML使用的,培训的是一位架构师,还好原来跟他沟通过。他给我了一个小工具,名叫Enterprise.Architect.7.0,这是一个轻便的UML画图工具。刚开始使用的时候真还找不到门路。慢慢摸索发现还是挺好用的。
如果你也跟我有同样的烦恼,不如尝试一下这个小工具。
posted @
2009-08-20 17:51 Sandy 阅读(2292) |
评论 (2) |
编辑 收藏