refnum在子vi与外部间不好传递
1、现在假设有这样个很大的数据文档,前5个字母中包含了一些文字信息,紧接着是两个数字,数字和文字都是我们想要的,那么,应该怎么把这两个东西分别提取呢。这个问题很白痴,很简单,用:
open file---->read from text file(5 letters)----->scan from file(%f %f\n)
再把后两步循环就可以了。
那么这里做一个有些蛋疼的对比:

经过我实验了一下,这个东西始终在读文件的第一行。
2、那是不是scan 和 read 两个东西不太兼容,传递不畅起的问题呢?
再做一个简单的对比试验,如果这个数据形式更简单,每行都是单纯的“%f %f\n”就可以读取的,那么用scan from file加while循环就可以读取所有数据(从头到尾)。
OK,让我再蛋疼一下,上一张图:

这张图中,程序也是一直在读第一行。
3、问题到底出在什么地方,为什么变成了“子Vi”,那个用来传递的refnum就不给力了呢?
我是比较傻一点……然后纠结了很长时间,直到昨天有位前辈粘贴了一段札记上关于“句柄和refnum”的话,引用如下:
“由于引用句柄是一个打开对象的临时指针,因此它仅在对象被打开期间有效。如关闭对象,
LabVIEW 图形化语言会将引用句柄与对象分开,引用句柄随即失效。如再次打开对象,LabVIEW
图形化语言将创建一个与第一个引用句柄不同的新引用句柄。LabVIEW 图形化语言将为打开的
引用句柄指向的对象分配内存空间。关闭引用句柄,该对象就会仍内存中释放。
由于LabVIEW 图形化语言可以记住每个引用句柄所指的信息,如读取或写入的对象的当前地址
和用户访问情况,因此可以对单一对象执行幵行但相互独立的操作。如一个VI 多次打开同一个
对象,那么每次的打开操作都将返回一个不同的引用句柄。VI 结束运行时LabVIEW 图形化语言
会自动关闭引用句柄”
不知道理解的对不对,我是这样理解的,在你把一个东西打包装进一个子vi的时候,运行时,刚开始分配出的句柄会在子vi运行完时被释放掉,这时候循环出去的就不知道是什么东西了。
等循环第二次开始这个子vi时,refnum是新分配的,继续指在文件的最开头,所以就一直在读第一行。
4、为什么要把read +scan 打包呢。
这里随便说一下,免得各位觉得这个东西是我在自找麻烦。
假设你要处理这样的数据(text file):
第一行,包含90%的垃圾字符,但是有这个文件保存的日期
第二行,基本没有用,有一些莫名其妙的十六进制码,但是有数据中包含的东西是那些物理量这样的信息。
之后的行,前面的76个字符没有用,记载的是这行数据测量的时间,不再需要,但是后面是"%f[TAB]%f....."总计24列数据。
经过可能几千行,可能几万行之后。
最后一行的格式也是特殊的。没有任何有用信息,但是形式区别于其他各行,可作为while循环结束的判据。
由于有很多种格式,很多种数据,这时候我就设计了一个子vi, 其输入是“input of refnum”,每次可以读取一行,输出有很多,包括“现在是在读哪个部分”,“文件的测量时间是什么”,“包含24种数据的数组”,“这些数据各是什么”,“output refnum”etc。
中间包含一些case结构,event结构等等。(因为直接把它弄在外部程序里,会显得很累赘,所以我就打包放进子vi了)
就是这个东西,把我折腾了很长时间,调了各种vi property,尝试过global variable(不知道用的对不对),但是就是不成。
今天终于决定不用子vi,累赘点就累赘点,放进去。结果很成功,没有任何问题。
这里算是一点教训,发给大家借鉴一下……
写的非常好
兽血沸腾黑岩最新章节http://92ks.com/18453/
