紫雨轩 .Net, DNGuard HVM , .Net VMProtect

DNGuard HVM - Advanced .NET Code Protection Technology

常用链接

统计

积分与排名

友情连接

最新评论

C#复杂表达式的问题

测试程序发现了一个bug, 几经调试最后定位到一条复杂表达式语句的计算结果不正确.

代码中用复杂表达式不是一个好习惯,调试起来很不方便.

为了方便跟踪调试,看看究竟是表达式的那部分计算出了问题.
就先把表达式拆开来写了.

再运行, 嗨, bug没有了. 跟踪看了表达式最终计算结果,也正确了.

问题表达式如下:
this.backgroundScaleFactor = ((this.fishEyeMagFactor * (this.LengthOfScale - (this.fishEyeHigh - this.fishEyeLo))) + (this.fishEyeHigh - this.fishEyeLo)) / (this.timeLine.VisibleTime(this.startTime, this.stopTime) * this.fishEyeMagFactor);

运行时得到的 结果不正确.
拆解为如下:
double tmp1 = ((this.fishEyeMagFactor * (this.LengthOfScale - (this.fishEyeHigh - this.fishEyeLo))) + (this.fishEyeHigh - this.fishEyeLo));
long tmplng = this.timeLine.VisibleTime(this.startTime, this.stopTime);
this.backgroundScaleFactor = tmp1 / (tmplng * this.fishEyeMagFactor);

 再运行结果就正确了.

教训: 尽量避免书写复杂表达式, 调试跟踪不方便.

问题的原因:
我估计是数据类型隐式转换造成的.

简单表达式的转换,很容易看清楚,可能有转换错误的一眼就能看出来.
复杂表达式自己都看得迷糊了.

posted on 2008-01-10 17:25 紫雨轩 .Net 阅读(2162) 评论(14)  编辑 收藏 所属分类: C# Winform编程

评论

#1楼  2008-01-10 17:27 囧 [未注册用户]

恩 最好还是分开写~变量注释下那是最好的!   回复  引用    

#2楼  2008-01-10 18:18 壁虎      

是够复杂的   回复  引用  查看    

#3楼  2008-01-10 19:28 Anders Cui      

我觉得添加的两个临时变量名也要改的有意义一点,要不还是读不懂啊   回复  引用  查看    

#4楼 [楼主] 2008-01-10 20:59 瑞克      

调试的时候随手加的两个变量。   回复  引用  查看    

#5楼  2008-01-10 23:48 jx3 [未注册用户]

有够复杂的呀   回复  引用    

#6楼  2008-01-11 08:24 阿勇      

使用除法的时候一定要注意,1/2 = 0的情况   回复  引用  查看    

#7楼  2008-01-11 08:58 风过 无痕      

这个在调试时的watch一下,就知道bug了。有必要设临时变量?   回复  引用  查看    

#8楼 [楼主] 2008-01-11 09:12 瑞克      

@风过 无痕
对C#的调试不是很熟,不知道怎么watch?   回复  引用  查看    

#9楼  2008-01-11 09:18 flyingchen      

不是在考试吧?搞这么复杂   回复  引用  查看    

#10楼 [楼主] 2008-01-11 09:37 瑞克      

@flyingchen
呵呵,不是.实际项目中的问题.


  回复  引用  查看    

#11楼 [楼主] 2008-01-11 09:38 瑞克      

@风过 无痕
刚才运行试了一下,好像和vc差不多.

不过还是有些问题.

这个表达式中 LengthOfScale 是一个属性,有一个相对复杂的get函数.
每次返回值是按规律变化的. 使用watch后会导致运行错误.

(类似于伪随机数,用种子初始化后,以后每次调用返回下一个数)   回复  引用  查看    

#12楼  2008-01-11 11:11 phcis      

仔细一点还是可以这样写的

不过后期的维护估计会很头疼列   回复  引用  查看    

#13楼 [楼主] 2008-01-11 11:36 瑞克      

@phcis
确实啊,如果接手维护别人的代码,都这样,那会郁闷死.
就算自己写的,时间长了再去维护也够头疼的.

事情起因在 fishEyeMagFactor 的类型,原来定义的是double.
但是这个变量的取值范围是有明确限制的,只能是 1 到 8 的整数.
就多手把它的类型改为 int 了.

  回复  引用  查看    

#14楼  2008-01-12 20:37 BirdsHover      

能看懂是第一位的   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: