在 LabVIEW 中实现 VI 的递归调用
LabVIEW 中使用递归调用不是很方便。不过递归并不是编程必须程序结构,任何需要使用递归调用
的地方,都可以用循环结构来代替。但是在某些情况下,使用递归调用的确可以大大简化程序代码,对缩
短编程时间、提高程序可读性都非常有帮助,所以学习一下递归的实现方法还是有好处的。
一、为什么 VI 不能够被静态的递归调用
LabVIEW 不能通过静态调用的方法(把子 VI 直接放到另一 VI 的程序框图上)来实现递归。
对于一个非可重入的 subVI,在每一个时间,这个 subVI 这能被运行一次。LabVIEW 需要借此来保证
多线程时的数据安全。对于被递归调用的代码,是需要在它执行到中间的时候,就再次被调用的。所以默
认设置下的 VI 不能被静态递归调用。
对于被设置为可重入的 VI,是可以被同时调用多次的,但也不能被静态的递归调用。
除非是通过 VI Server 动态的调用 VI,否则,LabVIEW 是在一个程序被调入内存,开始运行之前就为
它的所有 VI 分配好内存空间的,包括数据区。如果一个 VI 不是可重入的,LabVIEW 会在这个 VI 运行时
局部变量所在的数据区开辟在这个 VI 所在的空间内;对于可重入的 VI,LabVIEW 把它的数据区开辟在调
用者 VI 上,这样就可以保证这个可重入 VI 在不同的地方被同时调用时使用不同的数据区,以防止多线程
运行时数据混乱。
因此,可重入 VI 虽然可以被同时多次调用,但是被调用的次数是运行前就确定的。而递归运算时的
调用次数是运行时决定的。这样,如果是静态调用, LabVIEW 根本没有办法为提前为参与递归的 VI 开
辟好数据区。
二、用动态调用方法实现递归
图 1 是一个采用递归算法计算阶乘的例子
评论0