看到今天的评论,建议我写一点有关REFERENCE的文章,的确早就想写点这部分内容,但是不太容易,因为NI这方面的中文资料很少,我甚至无法准确地翻译REFERENCE。

REFERENCE的常规翻译是参考,目前国内有关LV的书籍也是这样翻译的,但是从我个人理解还是翻译成引用比较好。

为了准确理解引用的概念有必要先解释一下C语言中指针的概念。

int var;
int *pVar;
pVar=&var;


当我们声明了var整型变量后,在计算机的内存中就分配了四个字节的连续内存空间(与编译器有关,早期是两个字节),pVar是一个指向整型变量的指针,它本身就是32位整型数,自然也占四个字节的内存空间,不过这四个字节的内容是VAR的内存地址。

LV的参考是什么那?我个人理解就是对象的指针。我在一篇文章中提到,LV本身是基于数据流的,不过它的前面板控件却是典型的面向对象的类的继承关系。LV的对象就是指向各种类的指针(当然不仅仅是控件,菜单,文件等也是用参考进行参数传递的)。


C语言的指针有两种情况,一是未指向任何变量的指针( int *pVar,此时,只是定义了指针,未指向任何变量或者对象),二是指向了特定的变量或者对象(pVar=&var)

实际上,LV的参考也分成这两种情况,我们可以通过两种方式来创建控件的参考。
Picture
我们以CONTROL REFERENCE为例,当我们在前面板生成这个控件的时候,该控件未指向任何特定的控件,甚至未指向任何特定的数据类型,比如BOOLEAN ,NUMERIC等等。

从C语言的角度,更像定义了一个void *pVar;(当然,它已经指定的范围,是控件的参考)

我们可以认为它指向的是控件的基本类,但是是未初始化的,未指向特定对象。

LABVIEW的每一个REFERENCE都有一个编号,称为REFERENCE NUMBER,简写RefNum,RefNum是对象(可能是控件,面板,文件,菜单等)的唯一标识符号,这个标识符号如果理解成指针应该是个I32表示的内存地址。

对于C语言,未初始化的的指针一般让它指向0,看LV是否如此那?
Picture
对于前面两个,控件参考和菜单参考,因为未指向任何特定对象,所以他们的REFNUM的值是0,而下面的NUMERIC REFNUM,因为控件本身已经存在了,因此它的值是存在的,这和C语言是类似的。

一个未指向任何对象的指针称作空指针,那么未指向任何对象的参考也可以称作空参考。
Picture
可以看出,未指向任何对象的参考号REFNUM的值是0,LV判断它是一个空的或者非法的REFNUM.

对于两个指向同一特定控件的REFERENCE,它们的REFNUM是相同的。
Picture
由此可以得出结论,在加载前面板后,控件对象已经实际存在,指向同一控件的参考,他们的参考号是相同的。得到控件的参考号就可以控制控件的所有属性,如是否可见,闪烁等。

控件是一个层次的继承结构:

Picture
因为控件是个典型的类的继承结构,因此参考(指针)应该是可以向更基本的类或者更高层的类转换的,LV本身也的确提供了转换的节点。
Picture
我在CLASSNAME和CLASSID的文章中多次用到这两个节点,朋友们可以参考一下。

对于一个前面板对象,使用REFNUM似乎没有用途,因为前面板的控件是已知的,我们可以直接生成属性节点。更常用的功能是把参考放在SUBVI中,该SUBVI的输入是一个控件参考,因此,它不指向任何一个特定对象,因此它可以完成对所有同类对象的属性控制。

看个例子:
Picture
这样,我们就在SUBVI封装了数值型控件的属性,在主VI中,只需要传入特定控件的参考,就可以自动实现对这个控件的属性控制。

我在MULTILISTBOX和TABLE的特效制作中用的就是控件参考,可以参阅一下。

有些参考,比如文件参考,在没有打开文件时,显然号是空的,当操作完成后,需要进行关闭操作,释放内存。当再次打开文件是,又会产生一个新的临时的参考号,前后两个参考号没有任何关系,因为参考号是指向对象的临时指针,当对象不存在了时候,显然参考号也就不存在了。

参考和参考号使用非常广泛,又比较难于理解,需要多试验才能深入理解。
Picture



Leave a Reply.