灵异事件1:计算不可再现...

这几天在把我那个压缩的东东改写成C++的代码
过程并不复杂,顶多也就调试起来麻烦了点
后来为了要让VB能够调用,在网上疯狂搜索了ATL的资料
瞧完代码后测试的时候怪事情就来了~~~

我的代码里有个算术编码,出于精度和效果的考虑
中间过程是用浮点计算的,最后结果在放整数里
之前已经测试过,在VB里和VC++里都能正常得出结果
但是把代码放ATL工程里调试就出错啦
我实在没辙只好记录所有计算结果进行比对
然后就发现怪事的:
首先我声明编码和解码时各参数无论类型,数值完全一致
可能有人会说浮点型是看不出来的
可是我那个浮点数值是用整数做除法得到的,而整数的值是一样的
但是问题就出在这些参数得到的最终结果不一样
我以为是哪里写错了,就断点监视了一下,然后最奇怪的事情发生了:
断点的时候结果正确了,但是一取消监视就又错了

最后我只好用64位的整数运算来代替,果然算整数的时候正常了...
仔细看了一下监视的时候double的精度,有17位10进制数
猜想难道VB故意舍弃最后2位,用来进行舍入操作???
似乎以前关闭VB的浮点数检查之后计算结果也会变化的说

灵异事件2:消失的指针...

这个就更玄了...
VC++是可以重载运算符的,所以重载以后可以让代码很好看
这个事件就是发生在我重载=(赋值)运算的时候
我通过引用方式往函数里传递进了一个自定义的结构体
在里面我没有进行任何操作,只是进行了一次地址的判断,其余操作都在if的语句框里
然后就发现参数的地址被改变了,这时刚判断完,断点在if的语句框里第一行代码上
为纺万一,我加了const关键字同时单步跟踪,问题依旧
后来乱改了下,把if里面的语句都删了(里面的第一行代码还留着),居然正常了

想来想去原因不明,因为理论上被删的代码都没运行到才对...
诶,还是VB好啊,没这么多BT的问题...