先了解控件和数据类型的关系。LV控件面板上的图标都是典型的控件,说通俗一些,控件就是一个包含很多属性的容器,值是控件的一个属性,如下图所示的数字输入控件,值的数据类型就是控件所代表的数据类型,描述一个控件是通过类型描述符实现的,包括控件的名称、控件类型及控件所代表的数据类型等等。了解LV的数据类型是非常有必要的。特别是使用DLLs(shared libraries)、CINs(code interface nodes)或需要利用文件I/O往文件写入/读取二进制数(binary data)的用户,更有必须了解数据结构类型及在内存中存储格式。
数据类型之一——数字(Numeric) 包括:byte、word、long、SGL、DBL等
数据类型之二—— 数值型数组(Array) 存储为一个句柄(handle,指针的指针),指向的结构包括一个数值(I32)和一个数组,数值表达数组的大小,数组的元素表达每一个数字,这些数字在内存中连续存储。 提示:为了正确对齐数字,在第一个数字前可能需要附加一些字节数。当句柄为0,则是空数组。下列两图分别描述一维单精度(SGL)浮点数组、四维字整数(I16)数组,左边的数字代表偏移(offset)数组在内存起始存储位置的字节数。
其他数据类型 布尔、字符串、字符串数组、簇、路径 布尔(Boolean)型数据是字节型数据,存储为8位数值(一个字节),数值0表示False,其余数值代表True。布尔数组的存储格式如下图所示:
字符串(string)是一个字符型数组,存储为一个句柄(handle),指向的结构包括一个数值和一个数组(与数值型数组相同)。数组每个成员表达一个字符,数值表达数组长度。
字符串数组(Array of Strings)是非常特殊的数据类型,这也是CLF和CIN的难点。字符串在内存中是连续存储的,但是,字符串数组却与一般连续存放的二维数组不同,其元素(字符串)是以长度开头连续存储的,而字符串数组本身是存储在内存中另外位置的。(通过句柄与字符串建立联系)
提示: 1:和其他类型的数组一样,字符串数组也是以I32长度开头的,接下是每个字符串的首地址指针(句柄)——U32数值,表示字符串在内存中的地址(第一个字符)。由于字符串数组需要从内存的不同区域访问字符串(连续存储),会耗费更多的时间,因此,用一个长的字符串代替字符串数组,程序会更加高效。 2:LV是以句柄(Handle)描述数组和字符串,Handle本身是U32,占四个字节,它包含的内容是指向一个数据结构的指针,因为数据结构在内存中是可以重新分配的,所以它的地址会经常发生变化,而Handle的地址是不会变化的,通过Handle就可以跟踪数据结构。另外,对于每个数组和字符串,在长度信息之前还有一个16个字节的头部信息,(LV内部使用,类型描述符),因此一个最简单的数组至少占24个字节:HANDLE(U32)+HEADER(16Byte)+SIZE(I32)=24 BYTE。 簇 簇是一种数据类型,一个簇是一个由若干数据类型的成员组成的集合体,类似于C语言中的结构体和Pascal语言中的记录。簇的成员有一种逻辑上的顺序,这是由它们放进去的先后顺序决定的,与它们在簇中摆放的位置无关。前面的成员被删除时,后面的成员会递补。改变簇成员逻辑顺序的方法是在簇上弹出快捷菜单,选Reorder Controls In Cluster…弹出一个对话框,为簇成员设置新的逻辑顺序。 在内存中,簇直接存放标量数据(numeric)。对于数组、字符串或路径,簇只是存储这些数据类型的的首地址指针。不同操作平台(OS)在数据对齐有所差异,为确保存储数据的第一个元素对齐,可能需要往这个元素前添加一些字节数。下列图形显示一个簇(元素包括单精度浮点数、扩展精度浮点数和一个指向一维无符号字整型数组的首地址指针)在不同操作系统下的存储格式。
提示:簇可以直接嵌套簇,簇间接存储的数据(指针)只有数组、字符串或路径这三种数据类型。下图显示簇(元素两个标量数字加一个数组)和簇(元素为一个带两个标量数字的簇和一个数组)具有相同的存储方式。
路径 路径:使用标准的Windows语法,可以使用相对路径和绝对路径。存储为路径类型、路径成员数和路径成员。
|