源自混沌,归于混沌... 我的意志就是我的力量... 冲破千年封印的束缚... 我的眼中既没有光明,也没有黑暗...只剩下一片迷茫...
  • 在VS2008里遇到灵异事件了... *

    2008-11-19 23:05:23

    灵异事件1:计算不可再现...
    这几天在把我那个压缩的东东改写成C++的代码
    过程并不复杂,顶多也就调试起来麻烦了点
    后来为了要让VB能够调用,在网上疯狂搜索了ATL的资料
    瞧完代码后测试的时候怪事情就来了~~~
    我的代码里有个算术编码,出于精度和效果的考虑
    中间过程是用浮点计算的,最后结果在放整数里
    之前已经测试过,在VB里和VC++里都能正常得出结果
    但是把代码放ATL工程里调试就出错啦
    我实在没辙只好记录所有计算结果进行比对
    然后就发现怪事的:
    首先我声明编码和解码时各参数无论类型,数值完全一致
    可能有人会说浮点型是看不出来的
    可是我那个浮点数值是用整数做除法得到的,而整数的值是一样的
    但是问题就出在这些参数得到的最终结果不一样
    我以为是哪里写错了,就断点监视了一下,然后最奇怪的事情发生了:
    断点的时候结果正确了,但是一取消监视就又错了
    最后我只好用64位的整数运算来代替,果然算整数的时候正常了...
    仔细看了一下监视的时候double的精度,有17位10进制数
    猜想难道VB故意舍弃最后2位,用来进行舍入操作???
    似乎以前关闭VB的浮点数检查之后计算结果也会变化的说

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