【机器视觉】 HDevelop语言基础(四)-流程控制语句
发布日期:2021-06-29 20:52:45 浏览次数:2 分类:技术文章

本文共 4037 字,大约阅读时间需要 13 分钟。

00. 目录

文章目录

01. 概述

本节介绍的运算符是有条件地或重复地执行一组代码块。 通常,这些操作符是成对出现的:一个操作符标记块的开始,而另一个标记块的结束。 中间的代码行被称为控制流结构的主体。

当你输入一个控制流操作符来启动一个block时,HDevelop也会默认添加相应的关闭操作符来保持程序代码的平衡。 此外,光标放置在控制流操作符之间。 这对于输入新的代码块很好。 如果要将控制流操作符添加到现有代码中,您也可以单独添加操作符。 但是请记住,单个控制流运算符被视为无效代码,直到它的对应结束运算符也被输入。

在下面, 是一个计算结果为整数或布尔值的表达式。 如果表达式的计算结果为 0(零),则条件为假。 否则条件为真。 HDevelop 提供了以下操作符来控制程序流程。

02. if

此控制流结构有条件地执行代码块。 运算符 if 将条件作为其输入参数。 如果条件为真,则执行对应的代码段。 否则,在操作符 endif 之后继续执行。

if (
)...endif

03. if-else

if (
)代码段1...else代码段2...endif

如果条件为真就执行代码段1,否则执行代码段2。

04. elseif

if (
)...elseif (
)...endif

等价于

if (
)...else if (
) ... endifendif

如果条件1为真就执行代码段1,否则条件2为真执行代码段2.

05. while

这是一个循环控制流结构。 只要条件为真,就会执行循环体。 为了进入循环,条件首先必须为真。 可以分别使用运算符 continue 和 break 重新启动和终止循环(见下文)。

while (
)...endwhile

06. until

除了在循环结束时测试条件之外,此循环类似于 while 循环。 因此,repeat … until 循环的主体至少执行一次。 同样与 while 循环相反,如果条件为假,则循环重复,即,直到它最终为真。

repeat...until (
)

07. for

for 循环由开始值和结束值以及确定循环步骤数的增量值 step 控制。 这些值也可以是表达式,在进入循环之前立即计算它们。 表达式可以是整数类型或实数类型。 如果所有输入值都是整数类型,则循环变量也将是整数类型。 在所有其他情况下,循环变量将是实数类型。

请注意,for 循环在程序窗口中的显示与在算子窗口中输入的不同。 您在孙子窗口中输入的 for(start,end,step,index)在程序窗口中显示为:

for 
:=
to
by
...endfor

程序示例

Thus, after executing the following lines,for i := 1 to 5 by 1j := iendfori is set to 6 and j is set to 5, while in        for i := 5 to 1 by -1j := iendfori is set to 0, and j is set to 1.

可以分别通过操作符 continue 和 break 重新启动和终止循环。

请注意,在旧版本的 HDevelop(HALCON 11 之前)中,开始和终止值的表达式在进入循环时只计算一次。 出现在这些表达式中的变量的修改对循环的终止没有影响。 这同样适用于循环索引的修改。 它也对终止没有影响。 每次执行 for 运算符时,都会将循环值分配给正确的值。 有关详细信息,请参阅算子参考手册。

如果 for 循环太早离开(例如,如果您按停止并设置 PC)并再次进入循环,则将计算表达式,就像第一次进入循环一样。

在下面的例子中,从 0 到 6π 的正弦被计算并打印到图形窗口中(文件名:sine.hdev):

* Compute the sine from 0 to 3*PI and print to the graphical window* dev_close_window ()dev_open_window (0, 0, 512, 512, 'black', WindowID)dev_set_part (0, 0, 511, 511)old_x := 0old_y := 0dev_set_color ('red')for x := 1 to 511 by 4    y := sin(x / 511.0 * 2 * 3.1416 * 3) * 255    disp_line (WindowID, old_y + 256, old_x, y + 256, x)    old_x := x    old_y := yendfor

执行结果

在这里插入图片描述

在这个例子中,假设窗口的大小为 512×512。 绘图总是从最近评估的点到当前点进行。

08. continue

运算符 continue 强制执行 for、while 或 repeat 循环的下一个循环。 测试循环条件,并根据测试结果执行循环。

在以下示例中,处理了一组 RGB 彩色图像。 通过使用运算符continue跳过频道编号不是 3 的图像。 另一种方法是反转条件并将处理指令放在 if 和 endif 之间。 但是当涉及包含大量代码行的非常复杂的处理时,带有 continue 的表单往往更具可读性。

i := |Images|while (i)Image := Images[i]count_channels (Image, Channels)if (Channels != 3)continueendif* extensive processing of color image followsendwhile

09. break

运算符 break 使您能够退出 for、while 和 repeat 循环。 然后程序在循环结束后的下一行继续。

运算符 break 的典型用法是在某个条件成立时立即终止 for 循环,例如,如下例所示:

Number := |Regions|AllRegionsValid := 1* check whether all regions have an area <= 30for i := 1 to Number by 1ObjectSelected := Regions[i]area_center (ObjectSelected, Area, Row, Column)if (Area > 30)AllRegionsValid := 0break ()endifendfor

在以下示例中,只要单击图形窗口,运算符 break 就用于终止(无限)while 循环:

while (1)grab_image (Image, FGHandle)dev_error_var (Error, 1)dev_set_check ('~give_error')get_mposition (WindowHandle, R, C, Button)dev_error_var (Error, 0)dev_set_check ('give_error')if ((Error = H_MSG_TRUE) and (Button != 0))break ()endifendwhile

10. switch

switch允许通过多路分支控制程序流。 分支目标用 case 语句指定,后跟一个整数常量。 根据整数控制值,程序执行跳转到匹配的 case 语句并继续到下一个 break 语句或结束的 endswitch 语句。 一个可选的默认语句可以定义为 switch 块中的最后一个跳转标签。 如果没有前面的 case 语句与控制表达式匹配,程序执行将跳转到默认标签。

...switch (Grade)case 1:Result := 'excellent'breakcase 2:Result := 'good'breakcase 3:Result := 'acceptable'breakcase 4:case 5:Result := 'unacceptable'breakdefault:Result := 'undefined'endswitch...

11. stop

该语句暂停当前程序,程序将在执行该语句后停止执行下一条语句,直到通过键盘按下确认键后才继续执行程序。

12. exit

该语句停止程序,退出HDevelop软件。

13. return

算子return 从当前过程调用返回到调用过程。 如果在主程序中调用return,则PC跳转到程序末尾,即程序结束。

14. try-catch

这种控制流结构在 HDevelop 中启用动态异常处理。 操作符 try 和 catch 之间的程序块被监视异常,即运行时错误。 如果发生异常,有关导致异常的原因的诊断数据存储在异常元组中。 异常元组被传递给 catch 操作符,程序从那里继续执行。 运算符 catch 和 endtry 之间的程序块旨在分析异常数据并相应地对其做出反应。 如果没有异常发生,则永远不会执行该程序块。

15. throw

throw用于引发程序执行期间出现异常的情况,该语句通常与try-catch语句一起使用。

16. 附录

16.1 机器视觉博客汇总

网址:

转载地址:https://dengjin.blog.csdn.net/article/details/117879668 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【机器视觉】 HDevelop语言基础(五)-多线程
下一篇:【机器视觉】 HDevelop语言基础(三)-容器和保留字

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月26日 20时55分13秒