设为首页收藏本站

 找回密码
 注册
查看: 4519|回复: 4
打印 上一主题 下一主题

如何避免“FOR,WHILE,IF,ELSE中包含序列函数,可能存在潜在的逻辑错误。” [复制链接]

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
跳转到指定楼层
1#
发表于 2013-9-14 07:40:03 |只看该作者 |倒序浏览
如FOR,WHILE,IF,ELSE中包含序列函数,导致条件不满足时,序列函数的赋值就没有被执行,缺省继承了上一个序列值即x=x[1]; 解决的方法是将序列函数放在FOR,WHILE,IF,ELSE之外赋值,而在FOR,WHILE,IF,ELSE语句内引用相关变量。如:
Vars
   NumericSeries myBar;
Begin
   If (myBar/2==IntPart(myBar/2))
   {   myBar = CurrentBar;
       // 其他语句
   }
   Commentary ("myBay1 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
   Commentary ("Sum1: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
End
在这个程序中,由于myBar = CurrentBar; 语句是偶数时被赋值,因此显示的是连续的偶数对。
把赋值语句放到IF语句之前之外,则能解决不能每个Bar都赋值的问题,如下:
Vars
   NumericSeries myBar;
Begin
   myBar = CurrentBar;
   If (myBar/2==IntPart(myBar/2))
   {
       // 其他语句
   }
   Commentary ("myBay1 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
   Commentary ("Sum1: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
End

已有 1 人评分威望 收起 理由
傻了吧 + 25 很给力!

总评分: 威望 + 25   查看全部评分

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
2#
发表于 2013-9-14 08:20:25 |只看该作者
如果函数中含有序列函数,当有条件调用函数时,也会出现序列函数不完全赋值的情况,如:
// 应用主程序 Test1
Vars
   NumericSeries myBar;
Begin
   myBar = CurrentBar;
   Commentary ("myBay1 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
   Commentary ("Sum1: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
   if (myBar/2==IntPart(myBar/2)) Test2(myBar); //调用函数Test2
End

/ 函数 Test2
Params
   NumericSeries myBar;
Vars
Begin
   if (myBar/2==IntPart(myBar/2)) Return False;
   Commentary ("myBay2 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
   Commentary ("Sum2: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
   Return True;
End
此时,显示如下图:


如何将序列函数完整的传递给子函数呢?可把条件调用改为无条件调用,而把相应条件放入子函数中,如下示例:
// 应用主程序 Test1a
Vars
   NumericSeries myBar;
Begin
   myBar = CurrentBar;
   Commentary ("myBay1 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
   Commentary ("Sum1: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
   test2a(myBar); //无条件调用test2a
End

// 函数 Test2a
Params
   NumericSeries myBar;
Vars
Begin
   if (myBar/2 ==IntPart(myBar/2)) Return False; //当条件满足是返回
   Commentary ("myBay2 "+Text(myBar)+" "+Text(myBar[1])+" "+Text(myBar[2])+" "+Text(myBar[3])+" "+Text(myBar[4]));
   Commentary ("Sum2: "+ Text(myBar+myBar[1]+myBar[2]+myBar[3]+myBar[4]));
   Return True;
End
结果如下图:

附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
3#
发表于 2013-9-14 08:34:34 |只看该作者
仔细观察这连个图,发现有一个错误:第一个程序在偶数Bar上显示,而第二个程序却在奇数Bar上显示,显然逻辑上发生了错误。
原因是小可在修改程序时疏忽而至。由于Test1a是有条件调用Test2a,因此把条件移到函数中时,要把逻辑值取反,即把
if (myBar/2 == IntPart(myBar/2)) Return False;
改为
if (myBar/2 != IntPart(myBar/2)) Return False;
是不是这样?
分享给大家,也借此经常提醒自己,程序中尽量要避免编译时出现“FOR,WHILE,IF,ELSE中包含序列函数......”的警示提示。

使用道具 举报

Rank: 1

精华
0
UID
84387
积分
36
帖子
15
主题
4
阅读权限
10
注册时间
2011-12-5
最后登录
2015-7-29
4#
发表于 2014-7-17 10:37:43 |只看该作者
嗯。楼主分享的东西非常值得收藏

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
31697
积分
671
帖子
137
主题
13
阅读权限
60
注册时间
2011-4-2
最后登录
2020-10-8
5#
发表于 2015-12-11 12:41:41 |只看该作者
好东西,学习了

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-3 14:21

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部