数组和循环结构
簇
簇控件
簇(Cluster)和之前介绍的数值布尔等简单数据类型不太一样,它是一类复合数据类型,它可以把多个不同类型的数据组织在一起,变成一个新的数据类型。簇和 C 语言中的结构(struct)、Python 语 言中的元组(tuple)比较相似。

簇控件和简单数据类型的控件也有明显区别,把它拖到前面板上,开始只是个空壳,不能使用。我们还要给簇添加其它一些数据类型作为它的“元素”,把其它控件拖入簇控件即可。下图是一个已经放置了一些元素的簇:

簇是可以嵌套的:一个簇可以是另一个簇的元素。簇的常量的创建方式与控件的创建方式是类似的。
簇控件中元素控件的摆放位置,与簇数据中元素数据的逻辑顺序不一定是一致的。在程序框图中,处理簇数据时,只有元素数据的顺序是有意义的,与控件的摆放位置就不再相关了。当簇中元素比较多的时候,应避免元素随意摆放,可以让簇自动排布内部的元素。在簇的快捷菜单中选择“自动选择大小 -> 垂直排列”,这样,簇中元素个数变动时,不必再手动调整簇的外观。当选择自动排列时,簇中控件的位置顺序,就是簇中元素数据的顺序,这样保持一致,可减少顺序混淆的可能性。用鼠标把一个控件挪动到另一控件上面,是不会改变元素的顺序的,如果需要调整簇中元素的顺序,需要在簇的右键菜单中选择“重新排序簇中控件”。
在簇的右键菜单中选择“重新排序簇中控件”后,簇内每个元素上会出现两个数字:白底黑字代表当前的逻辑顺序,黑底白字代表修改后的新顺序。你需要按照你期望的顺序,依次点击每个控件。点击后,该控件的“新顺序”数字会随之更新。设置完成后,点击工 具栏上的“确认”按钮(或簇边框上的确认勾号)保存更改:

簇数据运算
在程序中处理簇数据的时候,通常都需要把簇中每个元素拿出来单独处理。把簇中元素分拆出来的过程叫“松绑”;反过来把元素数据放置到簇中的过程叫“捆绑”。“捆绑”/“松绑”(“解除捆绑”)有两种方式:一般的 “捆绑”/“松绑”,以及“按名称捆绑”/“按名称松绑”。它们都可以把几个简单的数据包装成一个簇,或者把簇中的元素拆分出来。“按名称捆绑”和“按名称松绑”支持动态调整长度,用户可以用鼠标选择捆绑或松绑出哪几个元素,顺序也可自定义。“捆绑”和“松绑”限制较为严格,每次都会捆绑或松绑簇中所有的元素,数据的顺序也是固定的,就是按照元素数据的逻辑顺序排列。
在程序中应尽量使用“按名称捆绑”和“按名称松绑”,而不是直接“捆绑”“松绑”。“按名称捆绑”和“按名称松绑”由于显示了元素的名称,不仅可读性比较好,还可以避免前后两个簇中元素顺序不一致等引发的错误:

LabVIEW 中最常见的簇,是错误输入簇和错误输出簇:
在大多数 VI 中都能看到错误簇的身影,它构成了 LabVIEW 程序最基本的 错误处理机制。错误簇由一个布尔类型数据(值为真时表示有错误)、一个数值型数据(错误代码)和一个字符串数据(错误信息)组成。
如果某些数据之间的相关性非常高,总是在一起被处理(比如:“是否有错”、“错误代码”和“错误信息”这三个数据),那么它们就很适合被捆绑成一个簇,这样,在不同的节点之间传递数据时,只需要一根数据线,可以让程序变得更整洁。使用簇的缺点是在处理数据的时候常常会多出“松绑”“捆绑”这个步骤。另外,一般最好不要在程序的用户界面上使用簇,它不利于调整用户界面上控件的布局。
尽管多数时候,处理簇数据需要“松绑”“捆绑”,也有一些情况是可以使用 LabVIEW 自带的函数直接对簇进行运算的。尤其是当簇中所有元素都是同一数据类型时。比如下面的程序:

程序左面的簇包含两个元素: x, y,它们用于表示平面上一个点的坐标。在平面上移动一个点,走过的距离也可以使用同样类型的簇表示。因此我们可以把两个簇数据相加,得到这个点移动后坐标。程序右面的簇包含两个字符串类型的元素,因此可以使用“字符串长度”函数计算簇中每个元素的长度。运算结果仍然是一个簇,包含两个数值数据元素,分别表示原来簇中两个字符串的长度。
不过,在多数应用中,簇中的元素会拥有不同数据类型,所以需要对簇的每个元素都做同一运算的情况是比 较少见的。
数组
数组数据
数组也是一种复合数据类型,与簇数据类型不同的是:一个数组中所有的元素的数据类型都必须是同一种。创建数组控件(或常量)与创建簇控件非常类似,首先把只有一个空壳的数组控件拖到前面板上,再把其它某个控件拖入数组控件即可:

数组元素的数据类型虽然是唯一的,但数据的个数可以是非常多的(理论上,在 32 位 LabVIEW 中,每个维度可以最多包含 个元素。在 64 位 LabVIEW 中,虽 然理论上索引可达 ,但实际大小主要受限于计算机的物理内存(RAM)。对于巨大的数组,内存往往是先于索引范围触顶的瓶颈)。数组控件左上角有一个额外的数字显示,它表示的是当前显示的数组元素的索引,也就是第几个元素。数组元素索引是从 0 开始计算的,第一个元素的索引是 0;第二个元素的索引是 1,以此类推。
有些应用中,需要在界面上查看数组中所有的元素,最好在界面上多显示几个元素。这时候,可以横向或纵向拖动数组控件的边框,数组就会显示多个元素。如果数组中元素太多,通过改变索引的值来查看每个元素可能就不那么方便了,还可以在数组的右键菜单中选择显示横向或纵向的滚动条,然后拖动滚动条快速移动到需要查看的数据:

一行或者一列的数据构成了一维数组,比如,一条曲线就常常使用一维数组来表示。用鼠标拖动数组控件的索引框,可以把默认的一个索引变成两个,表示数组从一维变成了二维。二维数组同时具有行和列,可以表示多条曲线,或者一个表格、一个平面的数据。同理还可以继续增加索引数量,表示三维以及更多维度的数组。
LabVIEW 中几乎任何其它数据类型都可以作为数组元素的数据类型,但数组本身不能作为另一个数组的元素。实际应用中,应该尽量使用多维数组,而不是数组的数组。在一定要把数组作为其他数组元素的时候,可以考虑先把作为元素的数组放入一个簇,再把这个簇作为另一数组的元素:
数组数据的运算
LabVIEW 中有些函数是专门针对数组的,比如计算数组长度、索引、排序以及计算数组的和等等。也有一些函数,它们原本用于数值类型、布尔类型等数据的计算,但也可以直接用于对相应数据类型的数组进行运算。比如,对数值型数据进行操作的加减乘除等运算,也可以用于数值型数组;对布尔型数据进行的与或非等运算都可用于布尔型数组。
以加法为例,把一个数值和数组相加,相当于把数组中每个元素都加上这个数值。而两个数组相加,则相当于把两个数组中对应的元素相加,得到另一个数组。两输入数组元素个数不同时,结果数组长度等于两输入中长度较短的那个数组的长度:

对数组进行编程运算时,需要注意数组长度是否正确,尤其注意输入的数组是否可能为空。有时程序需要对输入的空数组进行特殊处理以避免出错。
数组数据的比较
比较函数,如 "等于?"、"大于?" 等函数也可以用于数组的比较。这些比较函数用于比较数组(或者用于比较两个簇数据)时,可以在右键菜单中选择“比较元素”,或“比较集合”。“比 较元素”的意思是对两个数组中对应的每一个元素分别进行对比,比较的结果构成了一个同长度的布尔型数组。“比较集合”则是把数组整体作为一个整体,同另一个数组相比较,如果两个数组长度相同,每个对应元素也相同,则结果为“真”,否则为“假”。下图中的代码是对数组进行比较:
其运行结果为:
数组索引
通过索引拿到数组中某个元素的数据是最为常用数组操作之一。使用“索引数组”函数,可以得到数组中某个位置上的元素的值。“索引数组”函数的“索引”参数用于表明需要得到数组中的第几个元素。但是 “索引”参数也可以为空,即在缺省情况下,相当于输入为 0,表示需要得到数组的第一个元素。
需要索引多个数组元素时,并不需要使用多个“索引数组”函数,而是可以把“索引数组”函数拉长。把鼠标移到“索引数组”函数下边框中间的位置,按住鼠标左键即可将其图标拉长(或缩短),左侧出现多个“索引”参数。每个参数都可以设置不同的值。若输入“索引”均为空,其缺省值依次为 0、1、2、......,即输出依次为数组的第一个,第二个,第三个...... 元素。若输入“索引”在某一项索引后为空,则对应空索引的输出依次为非“空”的那一项 + 1、+2、......。比如下面的程序:
运行结果:
索引多维数组的时候,可以索引某个元素,也可以索引某个维度。比如需要索引二维数组某个元素时,就要求“索引”参数输入两个位置信息。LabVIEW 遵循 “先外层后内层” 或 “先每一个行 (Row) 后每一个列 (Col)” 的原则。当“索引数组”函数有两个索引输入端时,上面的接线端对应行索引,下面的接线端对应列索引:
运行结果:
数组合并
使用“创建数组”函数可以把元素添加到一个数组中,或者把几个数组合并。当创建数组函数的输入为一个非数组类型数据,和一个这个类型的一维数组时,创建数组函数会把非数组数据添加到数组中去。如果两个输入数据是类型相同的一维数组,默认情况下,创建数组函数会把它们合并成一个二维数组。但是选择创建数组函数输入端右键菜单中的“连接输入”,可以把两个输入的数组首尾相连,合成一个新的一维数组:
运行结果:
创建数组函数和数组索引函数一样,可以通过拉伸支持多个输入数据。
其它类型的数组控件
LabVIEW 中有些比较复杂的控件的数据类型也是数组,例如图表控件。这就使得数组数据可以有更丰富的表达方式。在某些情况下,以曲线或图形表达出来的数据比抽象的阿拉伯数字更加直观。
比如,先使用下图中的程序生成一个二维数组的数据:
除了使用默认的数组控件,我们也可以使用表格作为输出控件,显示出数组中所有的数据:
使用表格虽然能够精确地显示出每一元素的数值,但并不能直观的观察数据整体的变化的规律。因此,我们还可以使用强度图作为输出控件,这样,一眼就可看出数据变化的规律了:

LabVIEW 提供了多种多样的展示数据的方法,本书将在图形化显示数据一节做更详细的介绍。
for 循环
在实际应用中,数组的操作是离不开循环的。在多数情况下,我们都需要使用循环对数组中的每个元素做类似的操作。所以在继续深入讨论数组之前,我们要先介绍一下 LabVIEW 中的循环结构。LabVIEW 中有两个相似的循环结构:for 循环结构和 while 循环结构。
for 循环结构用于把结构体内的代码重复执行一定次数。这与大多数文本编程语言中的 for 循环都非常类似。LabVIEW 中常用的结构都在函数选板“编程 -> 结构”中。结构与函数和子 VI 等在外观上就有明显的不同:函数和子 VI 通常是一个小方块或者是大小相仿的其它形状的多边形,方块的边缘带有接线端;而结构通常是一个大小可变的矩形边框,在边框的内部是可以添加程序代码的。从函数选板上选择了 for 循环之后,可以把它放在程序框图的空白之处,也可以点住并拖动鼠标选定一块带有代码的区域,把这一块代码直接放置在新添加的 for 循环之内: