提高飞思小车程序之一(跳转的艺术)[原]
时间:06-24 09:16 阅读:1036次
*温馨提示:点击图片可以放大观看高清大图
简介:为了提高图像处理(特别是边缘检测)算法的效率,在循环处理中一旦找到灰度跳变就设定好标志位,然后返回,而不会继续在循环中苦苦搜索。因为目的已经达到了,已经找到该找的东西,不必把CPU浪费在循环中。下面WJ介绍几种实现的方法,供同学们参考。
为了提高图像处理(特别是边缘检测)算法的效率,在循环处理中一旦找到灰度跳变就设定好标志位,然后返回,而不会继续在循环中苦苦搜索。因为目的已经达到了,已经找到该找的东西,不必把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);
}
}
}
这个方法相对来说比较高级,主要是形参的传递比较高级,可以是数值,地址,引用,等等,非常灵活。
但也容易出错。建议用结构体指针。