多态函数
- 更新时间2025-08-27
- 阅读时长10分钟
多态是指VI和函数能够自动适应不同类型输入数据。函数多态的程度各不相同:可以是全部或部分输入多态,也可以是完全没有多态输入。有的函数输入可接收数值或布尔值,有的函数输入可接收数值或字符串,有的函数输入不仅接收数值标量还接收数值数组,数值簇或数值簇构成的数组等数据,还有的函数输入仅仅接收一维数组,数组的元素可以是任意数据类型。另外,有的函数输入可接收所有数据类型,包括复数值。用户还可以创建和使用多态单位。
数值转换
数值的任何一种表示法都可以转换为其他的表示法。如果把两个或多个不同表示法的数值输入连接到一个函数,函数将以较大较宽的表示法返回数据。函数在执行前会将短精度表示法强制转换为长精度表示法,同时LabVIEW将在发生强制转换的接线端上放置一个强制转换点。
某些函数的输出默认为浮点型,如除、正弦和余弦。如果将整型数值连接到这些函数的输入端,那么输入的整型数据首先被转换为双精度浮点数,然后才执行运算。但是,多数数值函数通过配置可返回用户指定的数据类型。
通常对于浮点标量数据而言,使用双精度浮点类型是最佳选择。处理单精度浮点数并不比处理双精度浮点数明显节省时间,与双精度浮点数相比,单精度浮点数更容易溢出。例如,分析程序库用的就是双精度浮点型数值。只有在必要时,才使用扩充精度的浮点型数值。扩充精度浮点数运算的速度和精度与平台有关。
对整数而言,使用32位有符号整型是最佳选择。
如用户将输出数据连接到一个数值表示方法不同的目标端口,LabVIEW将按以下规则转换数据类型:
- 有符号或无符号整型转换为浮点型 - LabVIEW将数据转换为尽可能接近的数值。如浮点数比整数精度高,这样的转换是精确的。如整数比浮点数精度高,LabVIEW在转换过程中将尽可能保持精确性。
- 浮点型转换为有符号或无符号整型 - 如果浮点型的数值在整型取值范围之外,那么LabVIEW将它转换为整型的最大或最小值。大多数整型对象被转换为浮点数,比如For循环计数连线端的值。小数部分为0.5的数值,将被LabVIEW舍入到最接近的偶整数。例如,LabVIEW会将6.5舍入到6,而不是将6.5舍入到7。
- LabVIEW将枚举型视为无符号整数 - 例如,如浮点数–1转换为枚举值,LabVIEW将它转换为枚举型取值范围内的值。如枚举型取值范围是0-25,LabVIEW将把值强制转换为0。
- 整型转换为整型 - 对于超出目标整型取值范围的数值,LabVIEW不会将它们转换为目标整型的最大或最小值。当被转换的源比目标的取值范围小时,如源是有符号的,LabVIEW将扩充源的符号位位数;如源是无符号的,LabVIEW将用零填充扩充的位。如源比目标的取值范围大,LabVIEW将仅截取最少的有效位数。
- 整型、浮点或定点数转换为定点数 - LabVIEW将定点数范围之外的值强制转换,使其位于所允许的定点数的最小值和最大值之间。
数值函数的多态性
算术函数的输入都是数值型数据。除了函数说明中所指明的一些特例以外,默认的输出数据通常和输入数据保持相同的数值表示方法,如果输入数据包含多种不同的数值表示方法,那么默认输出数据的类型是输入数据的类型中较大的那种类型。例如,如将一个8位整数和一个16位整数相加,则默认的输出将是一个16位整数。如配置数值函数的输出,则指定的设置将覆盖原有的默认设置。
算术函数是对数值、数值数组、数值簇、数值簇构成的数组,以及复数等数据对象的操作。对以上函数允许的输入类型进行归纳,得到以下定义:
数值型=数值标量 OR 数组 [数值型] OR 簇 [各种数值型]
数值标量可以是浮点型数字、整型数字或实部和虚部都为浮点数的复数。LabVIEW中,元素为数组的数组是非法的。
数组的维数和大小是任意的,簇中元素的数量也是任意的。函数输出和输入的数值表示法一致。对于只有一个输入端的函数,函数将处理数组或簇中的每一个元素。
对于有两个输入的函数,用户可以使用如下方式组合:
- 两个结构输入类似 - 当两个输入结构相同时,输出的结构与输入相同。
- 两个输入中有一个标量 - 当两个输入中有一个数值标量,而另一个是数组或簇时,输出为数组或簇。
- 两个输入指定了某种类型的数组 - 当两个输入中有一个数值数组,另一个是数值类型时,输出为数组。
对于两个输入结构类似的情况,LabVIEW将处理两个输入结构中的每一个元素。例如,将两个数组中的元素一一相加。此时,必须保证两个数组维数相同。也可以再对这两个维数相同的数组添加不同个数的元素;两个维数不同的数组作为输入相加时,输出的结果数组的维数和输入数组中维数较小的一致。两个簇相加的时候,必须拥有相同的元素个数,并且每对相应元素的类型必须相同。
对于两个输入包含一个标量和一个数组(或簇)的情况,LabVIEW的函数将处理输入标量和输入数组(或簇)中的每一个元素。例如,LabVIEW可以将数组中的每个元素减去一个特定的数,无论数组的维数有多大。
对于两个输入中一个是数值类型,另一个是这种指定类型元素构成的数组的情况,LabVIEW函数将处理指定数组的每个元素。例如,每张图都可以看作是以点为元素的数组,每个点又可以看作是一个簇,簇中包含两个数值型的元素:x和y。如果要将一张图在x方向上移动5个单位,在y方向上移动8个单位,那么可以将这张图中的每个点加上点(5,8)。
下图显示了“加”函数可能的多态组合。
布尔函数的多态性
逻辑函数的输入可以是布尔值、数值和错误簇。如果输入是数值型,那么LabVIEW将对输入数据进行位运算操作。如果输入是整型,那么输出数据是和输入相同表示的整型。如果输入是浮点型,那么LabVIEW会将它舍入到一个32位整型数字,而输出结果也将是32位整型。如输入是一个错误簇,LabVIEW只传递错误簇中状态的TRUE或FALSE值至输入端。
逻辑函数可以处理数值或布尔型的数组、数值或布尔型的簇、数值簇或布尔簇构成的数组等类型的数据。
对以上函数允许的输入类型进行归纳,得到以下定义:
逻辑型=布尔标量 OR 数值标量 OR 数组[逻辑型] OR 簇[多个逻辑型]
复数和以数组为元素的数组除外。
如果一个逻辑函数有两个输入,那么可以用和算术函数相同的方式组合这两个输入。但是,逻辑函数还受到一个更为严格的限制:只能对两个布尔值或两个数值进行基本操作。例如,不能在布尔值和数值之间进行“与(AND)”运算。下图列举了“与”函数中两个布尔值输入的几种组合方式。
数组函数的多态性
大多数的数组函数可以处理n维的数组,数组元素可以是任意类型。但是,函数说明中框图上的连线表明数值数组是缺省的数据类型。
字符串函数的多态性
字符串长度、转换为大写字母、转换为小写字母、反转字符串和字符串移位等函数可以处理字符串、由字符串构成的数组和簇,以及由簇构成的数组。转换为大写字母和转换为小写字母函数还可以处理数值、数值簇和数值数组,这两个函数把数值当作字符的ASCII码来处理。宽度和精度的输入必须是标量。
字符串转换函数的多态性
路径至字符串转换和字符串至路径转换均为多态函数。这两个函数可用于处理标量值、标量数组、标量簇和由标量簇组成的数组等类型的数据。这两个函数的输出数据和输入数据相比,除了转换后得到的新数据类型以外,其余的成分完全相同。
其他字符串/数值转换函数的多态性
数值至十进制数字符串转换 、数值至十六进制数字符串转换、数值至八进制数字符串转换、数值至工程字符串转换、数值至小数字符串转换、数值至指数字符串转换接收数值簇或数组作为输入,输出字符串簇或数组。十进制数字符串至数值转换、十六进制数字符串至数值转换、八进制数字符串至数值转换、分数/指数字符串至数值转换接收字符串簇或数组,输出数值簇或数组。宽度和精度的输入必须是标量。
簇函数的多态性
在输入输出端没有完成连线之前,捆绑和解除捆绑函数不会显示单个输入输出的数据类型。对这两个函数的输入输出端完成连线之后,这些接线端的样式和相应的前面板输入控件或显示控件接线端的数据类型一致。
比较函数的多态性
等于?、不等于?,和选择等比较函数的输入可以是任何类型,但所有输入的类型必须一致。
大于等于?、小于等于?、小于?、大于?、最大值与最小值和判定范围并强制转换等函数可以处理复数、路径及引用句柄以外任何类型的输入,所有输入必须类型一致。用户可以对数值、字符串、布尔值、字符串数组、数值簇、字符串簇等类型的数据进行比较。但是,不同类型的数据之间是无法比较的,例如,数值和字符串、字符串和布尔值之间无法进行比较。
与0进行比较的函数可以处理数值标量、簇和数值数组。这些函数的输出布尔值,数据结构和输入一致。
非法数字/路径/引用句柄?函数接受的输入类型和与0进行比较的函数的数据类型一致。此外,该函数还接受路径和引用句柄。“非法数字/路径/引用句柄?”函数的输出是布尔值,数据结构和输入一致。
十进制数?、十六进制数?、八进制数?、可打印?和空白?等函数可以处理字符串标量、数值、字符串簇、非复数构成的簇、字符串数组以及非复数构成的数组等类型的数据。这些函数的输出由布尔值组成,数据结构和输入一致。
空字符串/路径?函数可以处理路径、字符串标量、字符串簇、字符串数组等类型的数据。这些函数的输出由布尔值组成,数据结构和输入一致。
等于?、不等于?、非法数字/路径/引用句柄?、空字符串/路径?,以及选择函数都可以将路径和引用句柄作为输入,其余比较函数都不能将路径和引用句柄作为输入。
将数组和簇作为输入的比较函数通常返回布尔数组,数据类型和输入一致。如要让函数返回单个布尔值,右键单击该函数并从快捷菜单中选择比较模式»比较集合,勾选比较集合选项。
对数函数的多态性
对数函数的输入都是数值型数据。如果输入数据是整型,那么输出数据是双精度浮点型数值。否则,输出数据和输入数据的数值表示方式相同。
这些函数是对数值、数值数组、数值簇、数值簇构成的数组和复数等对象的操作。对以上函数允许的输入类型进行归纳,得到以下定义:
数值型=数值标量 OR 数组 [数值型] OR 簇 [各种数值型]
以数组为元素的数组除外。
数组的大小和维数是任意的,簇中元素的数量也是任意的。输出数据和输入类型的数值表示方式相同,函数将处理数组或簇中的每一个元素。有两个输入端的对数函数允许的输入类型组合如下所示:
- 两个结构输入类似 - 当两个输入结构相同时,输出的结构与输入相同。
- 两个输入中有一个标量 - 当两个输入中有一个数值标量,另一个是数值或簇时,输出为数值或簇。