00. 目录

文章目录

  • 00. 目录
  • 01. 概述
  • 02. if
  • 03. if-else
  • 04. elseif
  • 05. while
  • 06. until
  • 07. for
  • 08. continue
  • 09. break
  • 10. switch
  • 11. stop
  • 12. exit
  • 13. return
  • 14. try-catch
  • 15. throw
  • 16. 附录

01. 概述

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

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

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

02. if

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

if (<condition>)
...
endif

03. if-else

if (<condition>)
代码段1
...
else
代码段2
...
endif

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

04. elseif

if (<condition1>)
...
elseif (<condition2>)
...
endif

等价于

if (<condition1>)
...
elseif (<condition2>)...endif
endif

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

05. while

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

while (<condition>)
...
endwhile

06. until

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

repeat
...
until (<condition>)

07. for

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

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

for <index> := <start> to <end> by <step>
...
endfor

程序示例

Thus, after executing the following lines,
for i := 1 to 5 by 1
j := i
endfor
i is set to 6 and j is set to 5, while infor i := 5 to 1 by -1
j := i
endfor
i 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 := 0
old_y := 0
dev_set_color ('red')
for x := 1 to 511 by 4y := sin(x / 511.0 * 2 * 3.1416 * 3) * 255disp_line (WindowID, old_y + 256, old_x, y + 256, x)old_x := xold_y := y
endfor

执行结果

在这个例子中,假设窗口的大小为 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)
continue
endif
* extensive processing of color image follows
endwhile

09. break

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

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

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

在以下示例中,只要单击图形窗口,运算符 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 ()
endif
endwhile

10. switch

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

...
switch (Grade)
case 1:
Result := 'excellent'
break
case 2:
Result := 'good'
break
case 3:
Result := 'acceptable'
break
case 4:
case 5:
Result := 'unacceptable'
break
default:
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/116837497

【机器视觉】 HDevelop语言基础(四)-流程控制语句相关推荐

  1. Go语言基础语法-流程控制语句

    前言 程序是由语句构成,而流程控制语句 是用来控制程序中每条语句执行顺序的语句.可以通过控制语句实现更丰富的逻辑以及更强大的功能.几乎所有编程语言都有流程控制语句,功能也都基本相似. 其流程控制方式有 ...

  2. [GO语言基础] 五.顺序控制语句和条件控制语句(if、else、switch)

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Golang的 ...

  3. go语言打印日期_go语言基础:流程控制(4)-多重循环跳转控制

    1.6 多重循环控制 1.6.1 概念解析 1)多重循环就是指将一个循环嵌套在另一个循环体内,就形成了嵌套循环.在外边的for循环称之为外层for循环,在里面的for循环称之为内层for循环.2)实质 ...

  4. Java语言程序设计 上机实验2 掌握Java的基本语言成分和流程控制语句。 掌握Java中数组的使用,理解引用数据类型。 掌握String类的使用。...

      Java语言程序设计 上机实验2 实验目的: 掌握Java的基本语言成分和流程控制语句. 掌握Java中数组的使用,理解引用数据类型. 掌握String类的使用. 实验内容: 注:标(*)为选做内 ...

  5. [GO语言基础] 四.算术运算、逻辑运算、赋值运算、位运算及编程练习

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Golang的 ...

  6. 【机器视觉】 HDevelop语言基础(一)-基本类型和常量

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 基本类型 04. 控制类型 4.1 整型 4.2 实型 4.3 字符串 4.4 Boolean类型 4.5 句柄类型 05 ...

  7. 【机器视觉】 HDevelop语言基础(五)-多线程

    00. 目录 文章目录 00. 目录 01. 概述 02. 启动线程 03. 等待子线程结束 04. HDevelop中线程的执行 05. 监视线程 06. 挂起和恢复线程 06. 附录 01. 概述 ...

  8. java第一周_从计算机基础到流程控制语句(if_else)

    一.计算机基础 裸机 没有安装任何软件的计算机(无操作系统.无应用软件) 计算机的应用 1.科学计算 科学计算也称数值计算.计算机最开始是为解决科学研究和工程设计中遇到的大量数学问题的数值计算而研制的 ...

  9. Java编程基础04——流程控制语句

    1.顺序结构语句(了解) A:什么是流程控制语句 流程控制语句:可以控制程序的执行流程. B:流程控制语句的分类 顺序结构 选择结构 循环结构 C:执行流程: 从上往下,依次执行. D:案例演示 输出 ...

最新文章

  1. tf.keras.losses.CategoricalCrossentropy 多分类 交叉熵 损失函数示例
  2. BeanShell脚本接口之匿名类
  3. wojilu系统的ORM介绍
  4. rust为什么显示不了国服_AWS偏爱Rust,已将Rust编译器团队负责人收入囊中
  5. .Net Core with 微服务 - 可靠消息最终一致性分布式事务
  6. 【C语言重点难点精讲】C语言内存管理
  7. ICCV 2019 | ActivityNet 挑战赛冠军方案—时序动作提名,边界匹配网络详解
  8. python三维圆曲面_python – matplotlib中的曲面和三维轮廓
  9. python selenium语法_Python+Selenium基本语法
  10. MySQL之mysqldump的使用
  11. android 进入三方应用动画,Android 动画各种实现总结分享 AndroidAnimationExercise
  12. Android源码刷机步骤
  13. python填空题大全_『Python题库 - 填空题』151道Python笔试填空题
  14. Nginx反向代理:多域名跳转多台服务器(研发需求)
  15. Make it Divisible by 25
  16. python寻峰_python – 查找峰的全宽半个最大值
  17. 基于 Sentinel-2 卫星数据的像元三分法模型
  18. java 图片操作技术之RGB的获取
  19. 曼哈顿距离,欧式距离,明式距离,切比雪夫距离区别
  20. matlab中伽马函数的使用

热门文章

  1. H.264 Quantization
  2. [linux]cp和mv对文件和链接影响的区别
  3. java扑克发牌程序_Java多线程实现扑克牌发牌程序实例
  4. python中messagebox用法实例_pyqt4教程之messagebox使用示例分享
  5. c语言5的阶乘流程图_2020年,5种将死的编程语言!
  6. OSG使用更新回调来更改模型
  7. SharePoint2010 修改模板页在网页中间显示网站内容
  8. ie 9 渐变背景色兼容问题
  9. myEclipse开发内存溢出解决办法myEclipse调整jvm内存大小java.lang.OutOfMemoryError: PermGen space及其解决方法...
  10. 【LeetCode】191. Number of 1 Bits