返回   cpper编程论坛 > Blog
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

旧

调试艺术

发表于 2008-04-19 10:48 AM 作者: polyrandom
总觉得调试是个技术活,反正计算机就是个没有生命的工具,一切奇怪的输出都是输入+程序的必然结果。不过这几天越来越觉得调试和看风水差不多了。
起因是一个我负责的工具突然之间在我的vista上所有用OpenGL渲染的东西都不显示了。于是拿过去的版本看,发觉曾经显示正常的,现在也都显示不正常了。接下去就是例行地升级显卡驱动和重启,不过一切都没解决。最恐怖的是,在我测试的几十次里面,居然也有1-2次显示正确的。
后来对这个复杂的程序进行剥离调试,总算找到解决方案:把OpenGL窗口的DC取到以后不释放,就可以正确显示。请注意,这只是解决方案,因为我没找到原因。于是我在注册窗口类的时候设了OWNDC标志,然后在创建窗口后立即得到一次DC,永不释放。
本质上说,这件事情最终的原因还是玄学无关的,而是因为程序所生存的环境并不是完全由我们控制的。譬如说这个问题,也许是驱动程序的问题,也许是SDK代码实现的不好,也许是文档说的不够清楚,但是无论哪一条,都不是我们能够控制的。
万幸,我还是搞定了!!
polyrandom 的头像
超级版主
发表在 未分类
评论 2 polyrandom 当前离线
旧

operator==的误用?

发表于 2007-04-07 08:21 PM 作者: polyrandom
每次在写文章或者发帖子时,如果要表示两个值a和b相等,通常都会写a==b,但是每次意识到这一点,都会担心自己是不是误用了。

在C/C++(以及大多数具有这个运算符的语言)中,operator==只不过是一个比较运算,其值可能为真,也可能为假。也就是说,写出a==b并不能说明它们是相等的。不过好像很多人都会犯这个错误,甚至已经成为一种约定俗成了。

今天看C++ TR1的书,发现作者也喜欢使用a==b来表示两个值相等,希望这不是巧合。
polyrandom 的头像
超级版主
发表在 未分类
评论 0 polyrandom 当前离线
旧

体育彩票的概率

发表于 2007-03-10 02:26 PM 作者: polyrandom
今天一个朋友对我说他在大量购买体育彩票,并且把这个作为一种投资。劝告无果,尝试计算一下这个彩票的中奖概率。因为在我的概念里面,任何彩票的得益可能都是<1的。

按照他的说法,体育彩票的玩法是 0 - 9 十个球,每次摇出三个,这三个球的数字可以重复,譬如说112也是一个合法的组合。买张彩票的价格是2元,一共三个数字。如果开出的3个数字被包含在彩票的三个数字中,那么就中了。譬如说,如果你买得彩票是123;那么无论开出的是112还是321,都中了。一旦中奖,就可以得到216元。...
polyrandom 的头像
超级版主
发表在 未分类
评论 0 polyrandom 当前离线
旧

初始化错误 - 线程和同步变量

发表于 2007-02-28 07:36 PM 作者: polyrandom
  • 初始化顺序仍然是C++里面最普遍的错误之一
  • 在多线程情况下,初始化顺序会变得更加难以寻找
  • 改变类的继承顺序或是成员变量位置可以简单地改正初始化顺序

在我负责的程序里面,我们有一个用fiber实现的后台处理过程。这部分程序由于使用fiber,所以其实一直占着主线程的时间,通常情况下会把fps降低一半左右。因此这次准备把这段程序放到D3D Present的间歇中去。因为Present不是异步的,我们必须把单线程程序改成多线程的。我的选择是,在另一个线程里面写Present。

这样一个小小的修改,包括设计、编码、测试和改错,花了近一天的时间,最后终于通过检查,commit上去了。下午在调试另一个程序的时候,进入调试模式n次中,突然有一次程序死锁在初始化过程中。于是反复重现,发现一个错误,大致代码如下:

代码:
class MyThread : Thread
{
    Semaphore lock_;
    uint threadFunc( void* )
...
polyrandom 的头像
超级版主
发表在 未分类
评论 0 polyrandom 当前离线
旧

EPSILON的管理

发表于 2007-02-03 06:57 AM 作者: polyrandom
大多数时候,浮点数的运算结果之间是不能直接作相等比较的。譬如说,如果我们要判断一个经过转换的浮点数是不是还是0,通常需要

static const float EPSILON = 0.000001f;
return ( fabsf( f ) < EPSILON );

这会带来一些问题。就拿我现在写的软件来说,因为有很多不同的基础库,它们又被很多程序使用。大多数人在写类似的判断函数的时候,都比较偷懒,他们不会试图在最基本的类库里面放一个判断函数,而是自己局部写一个。这导致了整个系统内有很多相同的代码,作相同的事情,但是使用不同的...
polyrandom 的头像
超级版主
发表在 未分类
评论 0 polyrandom 当前离线

所有时间均为格林尼治时间 +9。现在的时间是 02:03 PM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0