提高飞思小车程序之一(跳转的艺术)
发布时间:2011-9-16 15:07
发布者:1640190015
摘自wanjian的日志 为了提高图像处理(特别是边缘检测)算法的效率,在循环处理中一旦找到灰度跳变就设定好标志位,然后返回,而不会继续在循环中苦苦搜索。因为目的已经达到了,已经找到该找的东西,不必把CPU浪费在循环中。下面WJ介绍几种实现的方法,供同学们参考。 1 用得最多的break和continue. 大家都知道break是跳出总循环,不再进行循环;continue是跳出本次循环,执行下一次循环. 如for (int i=0;i<10;i++) { if (i==5) break; printf(i); } 这样只能执行到i=5,打印输出0 1 2 3 4 如for (int i=0;i<10;i++) { if (i==5) continue; printf(i); } 这样只能执行到i=9,打印输出0 1 2 3 4 6 7 8 9,没有5 但是,有一个问题:break和continue只限于退出一层循环。如果是双重循环,那么只能退出内层循环。 for (int i=0;i<10;i++) { for (int j=0;j<10;j++) { if (i==5 && j==5) break; printf(i); printf(j); } } 这个结果大家可以自己试一下。 那怎么办呢,把上面的稍加改进即可。我们设置一个标志变量,如果内嵌循环退出,那么就把这个标志变量置位。然后在外层循环检测标志变量是否置位,为真的话跳出外层循环。 BOOL bset=FALSE; for (int i=0;i<10;i++) { for (int j=0;j<10;j++) { if (i==5 && j==5) { bset=TRUE; break; } printf(i); printf(j); } if (bset) break; } 2 在for循环里加限制条件. BOOL bset=FALSE; for(;!bset;) { for(;!bset;) { if (i==5 && j==5) bset=TRUE; else { printf(i); printf(j); } } } 这种方法适用条件不多的情况,否则程序可读性很差。 3 直接用goto goto这个语句一直让不少人不齿,但是存在即合理。个人觉得它用在这种情况是最合适的了。 for (int i=0;i<10;i++) { for (int j=0;j<10;j++) { if (i==5 && j==5) { goto out; } printf(i); printf(j); } } out: your next code..... 为什么有人一直抨击它呢?是因为用上它就会喜欢上它,无法自拨以至于见到程序跳转就想到goto,结果当然就挠乱整个程序的秩序。 4 补充一条。单独写个void calculate (XXXXX) void calculate (XXXXX) { for (int i=0;i<10;i++) { for (int j=0;j<10;j++) { if (i==5 && j==5) return; printf(i); printf(j); } } } 这个方法相对来说比较高级,主要是形参的传递比较高级,可以是数值,地址,引用,等等,非常灵活。 但也容易出错。建议用结构体指针。 |
网友评论