终于读完了整本《心理学》

    这是我这几年读的时间最长的一本书(大约读了两年),一是因为它特别厚(699页),再有这本书是断断续续读的。我这本《心理学》的作者是 David G. Myers,是美国比较流行的一部心理学导论教材,我看到的是它的第七版。
    在读这本书的过程中,陆续给书中某些内容写了读后感。但对于大多数让我受益的知识,后来都没时间整理。现在全书看完,虽然不可能把所有受益都评论一番,但说一下我认为读此书的必要性吧。

    听《百家讲坛》王立群讲课的时候,有一回他提到:一个人要想成就一番事业,只琢磨事是不够的,够重要的要琢磨人。这句话要正面来理解,琢磨人可不是算计别人;而是要掌握和理解自己乃至别人的思维方式。说的具体点,如果你当对方是敌人,知己知彼才能取胜;如果你当对方是朋友,知己知彼才能相处融洽。文明发展的趋势就是人越来越社会化。现在别说干事业,即便是日常工作生活也离不开与人打交道。对人性的理解程度直接影响到你的受欢迎程度,从而又间接影响了工作效率和生活质量。
    人类的共性远大于个性差异,所有人的思维方式都符合一定规律。这就为掌握人性提供了可能性。然而,领悟这一规律却不那么容易。有些人天资聪颖,总能猜到别人心思,做事八面玲珑;而像我,这方面却十分愚钝。不要说平时接触的各色人等,就算最亲之人,如老婆,我有时候都不知道她想干啥。不知道对方的心思是很被动的:有时候自以为替对方着想,献点殷勤,却不想看错了时机,一巴掌拍在马腿上,讨个没趣。在家里还好,如果是工作中也出现这种情况,麻烦就大了。
    好在我一直知道自己的不足,并且相信这可以通过学习弥补。那天逛书店,一眼看到这本《心理学》。于是就买回了一本,来补补课。之后没几天,就已确信它物有所值。我经常看着看着书,就感慨一句:原来是这么回事啊!有些知识还可以立马被应用到实践中,看完了人脑记忆形成那一节,我立刻想到了一些方法来改善自己的记性。
    当然,待人接物的习惯不会因为读一本书就会轻易得被改变。但是,只要保持完善自己的动力,日积月累,总会不断进步的。

    可能是心理作用,我觉得自己读这本书期间,周围人际关系和谐了不少:) 不知道我老婆赞同不?

Advertisements

家里终于连上网了

今天请假在家,就是为了装电话和宽带。张江这个地方还是偏僻了点,上网没什选择,就只有电信的ADSL。
网络装好,就迫不及待的VPN到公司。网速还不错。哈哈,以后再也不用下了班还呆在公司了。

既然有了网络,我准备写文章的进度也提高一些。平时晚上没事,都可以上blog写两句了。

LabVIEW 中的类

一、创建一个空的类

    在 LabVIEW 工程窗口里,鼠标右键菜单的新建栏中有一项,是创建类。类的结构和 LabVIEW 工程库是比较相近的:类的名字也作为名字空间;也可以为类中的 VI 设置访问权限等。类在硬盘上被保存在一个 .lvclass 文件中。这个文件其实是一个XML格式的文本文件,它的格式与 .lvlib 类似。
    类是一个抽象的定义,符合这个类的实体,叫做类的实例。这有点类似数据类型和数据之间的关系。

    我们先来创建一个名叫 Animal 的类吧,用它来描述一些动物的属性和行为。现实中,通过特定的属性和方法(行为)来定义某一类事物;与之对应的 LabVIEW 中的概念是类的数据和VI。
    动物类是一个类,符合这个概念的任何一个实体比如某一只小猫,一条小狗就是这个类的实例。程序中处理的都是这些实例。


图1:创建类的菜单

二、类的属性

    在工程窗口中可以看到,每个类包含数个 VI 和一个与类同名的 .ctl 项。尽管它的面板与设置方法与用户自定义控件类似,但它实际上并不是一个独立的用户自定义控件。此外,类的.ctl项必须是一个 Cluster。Cluster 中的元素就是这个类所使用的数据,相当于 C 语言的类中的变量。通过改变 Cluster 中的元素的默认值,你可以在这里设置类的属性的初始值。

    与 C 语言不同之处是,LabVIEW 类中数据只能是私有的。
    公有数据是最容易被滥用的。为了自己使用方便,非常专业的编程人员常常倾向于把类中的数据都设置为公有,可以方便随时随地访问它。但这样一来就完全破坏了类的封装性,不加控制地访问类中的数据增加了模块间的耦合度,使得可读性和可维护性都大大降低。
    通过类的方法访问类中数据就安全得多。比如我们可以在方法中添加对写入数据的合法性检查,在数据越界时报错等。
    这样也有利于调试。比如我们需要跟踪某个类的数据的变化,如果数据是公有的,程序运行时就无办法预知它是在那里被改变的。若数据是私有的,我们就可以确定它只在类中设置它的 VI 中被改变。只要在这个VI上加个断点,就可以在调试时,令程序在数据被改变之前暂停运行。
    LabVIEW 相当一部分用户是非计算机专业的人员。对于他们来说,概念越简单越好。类的数据强制为私有类型,可以避免他们接触更多的程序设计概念,而直接引导他们使用最佳的程序设计方法。

    这样的设计方法唯一不足之处是:即便是的确需要被类之外的 VI 直接访问的数据,也必须给他们创建一个公用的方法,通过这个方法间接访问这个数据。幸好,类的右键菜单中有一项专门为数据创建访问 VI 的选项(VI for Data Member Access…)。通过它,可以便捷地创建出数据访问 VI 以供使用。

    现在,回到我的 Animal 类:它有两个属性,分别是动物的年龄和颜色。于是我在 Cluster 中放了两个分别表示年龄和颜色的控件。

 
图2:添加类的数据(类的属性)

三、类的方法

    鼠标右键点击在类上,就可以为类创建 VI,也就是类的方法。

 
图3:创建新方法

    在上图新建这一栏下可以看到很多条目:
    VI,就是指创建一个普通的 VI。
    Virtual Folder,是文件夹。如果类中的方法很多,可以把它们归类到不同的文件夹中,便于管理。
    VI from Dynamic Dispatch Template,所创建出来的VI类似于 C 语言中的虚函数。应用程序再调用这个 VI 的时候,可能实际执行的是某个子类中的同名方法。
    VI from Static Dispatch Template,所创建的 VI 比普通 VI 多了类方法最常用的代码框架。程序员可以省去一些自己画错误处理选择框的时间。它与 VI from Dynamic Dispatch Template 唯一的区别在于:类输入输出接线端子(这个例子中是“Animal in/out”)不是动态调度的。(参见图4:动态调度的接线端子)
    VI for Data Member Access…,因为类的数据全部是私有的,所以需要借助公有VI来访问他们。这个选项可以帮你快速建立读写类中数据的VI。
    VI for Override…,这个选项是专门给子类用的。用来创建覆盖父类方法的VI。
    Control,创建用户自定义控件,这一条与类的概念不相关,仅为了方便用户。


图4:动态调度的接线端子

    在类的类的属性面板中可以设置类中每个 VI 是公有的还是私有的。这与工程库中 VI 的设置是类似的。

    可能你已经发现了,与其它语言不同,LabVIEW 中的类没有构造和析构函数。构造函数在一个类的实例(数据为这个类的一个变量)生成时被自动调用,析构函数在它被销毁时自动调用。
    在 C 语言中,你可以明确地知道一个变量的生存周期。全局变量在程序启动时被创建,程序结束时被销毁;函数的局部变量在函数被调用时创建,退出函数时销毁,等等。这些都是程序在运行时的行为。但是在 LabVIEW 中,变量的生存周期不一定是在运行过程中。LabVIEW 的变量通常对应有一个前面板上的控件,控件包含的数据在编辑状态下就已存在了,程序运行结束也不会被销毁。这就使得构造函数和析构函数失去了原有的意义。比如,构造函数和析构函数一个最常见的用法是在构造函数内预留某一资源,以供类中的方法使用,在析构函数内释放这个资源。LabVIEW 若有类似功能,则VI被打开时,资源就被霸占住了,这在逻辑上是错误的。
    没有构造函数和析构函数,我们可以把预留释放资源一类的工作放在普通的类的方法中实现。只是在使用这个类的实例的时候,需要程序员自己调用这些方法。

四、类的继承

    为了让演示程序更有意义,再分别为狗和鸡创建两个类。这两个类应为动物类的子类。进入类的属性对话框,在 Inheritance 一栏中选择animal.lvclass作为它的父类,这两个类便成了animal的子类。可以注意到,LabVIEW 中所有的类都有一个共同的父类“LabVIEW Objet”。

  
图5:设置类的继承关系

    在这个设置面板上可以看到,LabVIEW 所有的类都有一个共同的祖先类 LabVIEW Object。LabVIEW Object 是个空类,既没有方法也没有属性。那么它存在的意义是什么呢?
    这要先介绍一下泛型编程的概念。理论上,设计程序模块时,越抽象越好。这样同一段代码可以被应用到更多的具体问题中去。本着这个原则,程序中算法和数据类型应该是独立的。比如,一段排序算法的代码被完成后,应当可以被应用在各种数据类型上,既可以用来给一组整数排序,也可以给一组字符串排序。这就是泛型编程。
    LabVIEW 暂时支持泛型编程,一个算法 VI 写好,它作为传递参数的控件的数据类型也就定死了。不能够直接使用在其它数据类型上。但是类的实例作为一个数据在 LabVIEW 不同节点间传递时,它的数据类型可以在它本身的数据类型,以及它的任意一个祖先类之间进行切换。比如在处理一只狗小狗的时候,可以把它当作是狗,也可把它当作是动物,还可以把它当作是 LabVIEW Object。
    我们再实现一个算法的时候,使用 LabVIEW Object 作为它的参数的数据类型。这样这个算法就可以被应用到人和一种“类”的数据上。Java,就是采用了类似的机制来实现泛型编程的。但是 LabVIEW 并没有因此获得泛型编程的能力。与 Java 不同,LabVIEW 不能直接把一个普通数据类型(比如整数,字符串等)转换成某种“类”。所以,LabVIEW 编写的算法还是不能支持任何数据类型。

五、其它辅助性设置

    设置好继承关系,再为子类创建几个属性和方法,我们的演示类就搭建完成了。为了让应用程序美观易读,我们可以修改这几个类的数据线外观。否则,所有的类的数据线千篇一律,很容易就混淆了。数据线的外观也是在类的属性对话框中配置的。


图6:配置类数据线的外观

六、演示程序

    我们再简要介绍一下类的多态:在动物类中先用虚函数方法(VI from Dynamic Dispatch Template)创建一个“叫唤”方法:Make Sound.vi。因为狗和鸡的叫声不一样。因此,在两个子类中,我们用 VI for Override… 重新实现这个方法,使其覆盖父类中的“叫唤”。应用程序中有几个不同动物的实例,程序的任务就是让它们每个实例叫一声。借助类的多态特性,应用程序不需要判断实例数据所属的子类,再根据不同子类编写不同代码的。它可以把所有实例用他们共同的父类的类型来传递,代码中也只是用父类的方法。而程序执行到父类的方法时,会自动执行已经覆盖了它的相应的子类的方法。从而让不同的动物发出不同的叫声。


图7:动态调用的示例

下载示例程序
《我和LabVIEW》目录

又失眠了:(

    今天早上头疼的很,因为凌晨三点的时候突然醒过来就再睡不着了。据我爸说,我这是从他那遗传来的毛病。睡不着觉的时候就会瞎琢磨。今早躺在床上想来想去,就想到了鲁迅。
    这是我上学的时候最讨厌的人之一,他写的语言文不文,白不白,怎么读都别扭,还必须要背诵,烦死了。其实对于一个中学生,哪里理解的了鲁迅的文章呢,当时背了也是白背的。
    只有当我也踏上社会之后,对各种现象了解的多了,才开始慢慢理解和喜欢鲁迅了。前些天听了《百家讲坛》一组关于鲁迅作品的讲座,现在听来与当年上课那会的感觉竟然完全不同。
    帖一篇他的作品,以向鲁迅以及那个允许他发表文章的时代表示敬意。

 

《纪念刘和珍君》

鲁 迅

中华民国十五年三月二十五日,就是国立北京女子师范大学为十八日在段祺瑞执政府前遇害的刘和珍杨德群两君开追悼会的那一天,我独在礼堂外徘徊,遇见程君,前来问我道,“先生可曾为刘和珍写了一点什么没有?”我说“没有”。她就正告我,“先生还是写一点罢;刘和珍生前就很爱看先生的文章。”

这是我知道的,凡我所编辑的期刊,大概是因为往往有始无终之故罢,销行一向就甚为寥落,然而在这样的生活艰难中,毅然预定了《莽原》全年的就有她。我也早觉得有写一点东西的必要了,这虽然于死者毫不相干,但在生者,却大抵只能如此而已。倘使我能够相信真有所谓“在天之灵”,那自然可以得到更大的安慰,—— 但是,现在,却只能如此而已。

可是我实在无话可说。我只觉得所住的并非人间。四十多个青年的血,洋溢在我的周围,使我艰于呼吸视听,那里还能有什么言语?长歌当哭,是必须在痛定之后的。而此后几个所谓学者文人的阴险的论调,尤使我觉得悲哀。我已经出离愤怒了。我将深味这非人间的浓黑的悲凉;以我的最大哀痛显示于呜呼,我说不出话,但以此记念刘和珍君! 非人间,使它们快意于我的苦痛,就将这作为后死者的菲薄的祭品,奉献于逝者的灵前。

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。这是怎样的哀痛者和幸福者?然而造化又常常为庸人设计,以时间的流驶,来洗涤旧迹,仅使留下淡红的血色和微漠的悲哀。在这淡红的血色和微漠的悲哀中,又给人暂得偷生,维持着这似人非人的世界。我不知道这样的世界何时是一个尽头!

我们还在这样的世上活着;我也早觉得有写一点东西的必要了。离三月十八日也已有两星期,忘却的救主快要降临了罢,我正有写一点东西的必要了。

在四十余被害的青年之中,刘和珍君是我的学生。学生云者,我向来这样想,这样说,现在却觉得有些踌躇了,我应该对她奉献我的悲哀与尊敬。她不是“苟活到现在的我”的学生,是为了中国而死的中国的青年。

她的姓名第一次为我所见,是在去年夏初杨荫榆女士做女子师范大学校长,开除校中六个学生自治会职员的时候。其中的一个就是她;但是我不认识。直到后来,也许已经是刘百昭率领男女武将,强拖出校之后了,才有人指着一个学生告诉我,说:这就是刘和珍。其时我才能将姓名和实体联合起来,心中却暗自诧异。我平素想,能够不为势利所屈,反抗一广有羽翼的校长的学生,无论如何,总该是有些桀骜锋利的,但她却常常微笑着,态度很温和。待到偏安于宗帽胡同,赁屋授课之后,她才始来听我的讲义,于是见面的回数就较多了,也还是始终微笑着,态度很温和。待到学校恢复旧观,往日的教职员以为责任已尽,准备陆续引退的时候,我才见她虑及母校前途,黯然至于泣下。此后似乎就不相见。总之,在我的记忆上,那一次就是永别了。

我在十八日早晨,才知道上午有群众向执政府请愿的事;下午便得到噩耗,说卫队居然开枪,死伤至数百人,而刘和珍君即在遇害者之列。但我对于这些传说,竟至于颇为怀疑。我向来是不惮以最坏的恶意,来推测中国人的,然而我还不料,也不信竟会下劣凶残到这地步。况且始终微笑着的和蔼的刘和珍君,更何至于无端在府门前喋血呢?

然而即日证明是事实了,作证的便是她自己的尸骸。还有一具,是杨德群君的。而且又证明着这不但是杀害,简直是虐杀,因为身体上还有棍棒的伤痕。

但段政府就有令,说她们是“暴徒”!

但接着就有流言,说她们是受人利用的。

惨象,已使我目不忍视了;流言,尤使我耳不忍闻。我还有什么话可说呢?我懂得衰亡民族之所以默无声息的缘由了。沉默呵,沉默呵!不在沉默中爆发,就在沉默中灭亡。

但是,我还有要说的话。

我没有亲见;听说她,刘和珍君,那时是欣然前往的。自然,请愿而已,稍有人心者,谁也不会料到有这样的罗网。但竟在执政府前中弹了,从背部入,斜穿心肺,已是致命的创伤,只是没有便死。同去的张静淑君想扶起她,中了四弹,其一是手枪,立仆;同去的杨德群君又想去扶起她,也被击,弹从左肩入,穿胸偏右出,也立仆。但她还能坐起来,一个兵在她头部及胸部猛击两棍,于是死掉了。

始终微笑的和蔼的刘和珍君确是死掉了,这是真的,有她自己的尸骸为证;沉勇而友爱的杨德群君也死掉了,有她自己的尸骸为证;只有一样沉勇而友爱的张静淑君还在医院里呻吟。当三个女子从容地转辗于文明人所发明的枪弹的攒射中的时候,这是怎样的一个惊心动魄的伟大呵!中国军人的屠戮妇婴的伟绩,八国联军的惩创学生的武功,不幸全被这几缕血痕抹杀了。

但是中外的杀人者却居然昂起头来,不知道个个脸上有着血污……。

时间永是流驶,街市依旧太平,有限的几个生命,在中国是不算什么的,至多,不过供无恶意的闲人以饭后的谈资,或者给有恶意的闲人作“流言”的种子。至于此外的深的意义,我总觉得很寥寥,因为这实在不过是徒手的请愿。人类的血战前行的历史,正如煤的形成,当时用大量的木材,结果却只是一小块,但请愿是不在其中的,更何况是徒手。

然而既然有了血痕了,当然不觉要扩大。至少,也当浸渍了亲族;师友,爱人的心,纵使时光流驶,洗成绯红,也会在微漠的悲哀中永存微笑的和蔼的旧影。陶潜说过,“亲戚或余悲,他人亦已歌,死去何所道,托体同山阿。”倘能如此,这也就够了。

我已经说过:我向来是不惮以最坏的恶意来推测中国人的。但这回却很有几点出于我的意外。一是当局者竟会这样地凶残,一是流言家竟至如此之下劣,一是中国的女性临难竟能如是之从容。

我目睹中国女子的办事,是始于去年的,虽然是少数,但看那干练坚决,百折不回的气概,曾经屡次为之感叹。至于这一回在弹雨中互相救助,虽殒身不恤的事实,则更足为中国女子的勇毅,虽遭阴谋秘计,压抑至数千年,而终于没有消亡的明证了。倘要寻求这一次死伤者对于将来的意义,意义就在此罢。

苟活者在淡红的血色中,会依稀看见微茫的希望;真的猛士,将更奋然而前行。
呜呼,我说不出话,但以此记念刘和珍君!

发表于一九二六年四月十二日《语丝》周刊第七十四期

传引用

    传值是符合数据流驱动程序的传参方式,LabVIEW 中应该尽量使用这种方式。但是传引用在某些情况下是不可避免的,比如程序要在不同的线程中对同一数据进行操作,就得用到传引用。
    引用在 C++ 中和指针本质上是一个东西,只是使用规则有些不同罢了。它们都是一个4或8字节的整数,这个整数表示的是目标数据所在的地址。程序代码通过这个地址来访问数据。
    在 LabVIEW 中,没有指针的概念,但是我们可以通过多种形式来完成传引用的功能。下面我们就来讨论一下这些传引用的形式。

一、LabVIEW 自带的传引用数据类型

    在 C++ 语言中,调用子函数时,可以指定某个参数是传值还是传引用。LabVIEW 采用的是完全不同的机制:在一般情况下,数据类型决定了这个数据是采用传值还是传引用。LabVIEW 中大部分数据类型是值传递的,一少部分数据类型专门用于传引用。例如,控件选板上的 Refnum 栏上的控件就都是传引用数据类型的控件。在程序框图上,用深色细绿线表示这类传引用的数据类型。


图1:Refnum 选板

    使用 VI Scripting 编程时常会使用到 VI Refnum, Control Refnum 和其它对象的引用。与传值不同,在传递这些数据时,如果数据线分叉,并不意味把它们所表示的控件等复制了一份。新分出来的 Refnum 还是指向原来的那个控件。

    除了各种 Refnum,LabVIEW 中还有其它一些数据类型,尽管其数据线的颜色不同,其实也属于传引用的数据类型。它们包括了硬件设备的句柄(VISA Resource, IVI Logic等), notifier, event, queue 等等。

二、全局变量

    在实际编程过程中,更常见的是我们希望把一个普通类型的数据按传引用方式传递。比如一个数组,一个自定义的簇等。
    全局变量是一种最简便的传引用的方式。全局变量的数据被保存在某一固定的内存空间里,但在不同的 VI 或线程中,都可以通过表示这个全局变量的对象来访问数据。
    在使用全局变量时,直接把表示全局变量的 VI 或节点放在程序中就可以访问它的数据了。这种方式尽管有其优点,但更多的却是缺点。我们在阅读 LabVIEW 程序的时候,数据线是非常重要的线索。它为我们指明了程序执行的顺序,数据传递和加工的过程。失去数据线这一重要线索,就不容易搞清楚这个数据是从哪里来的,何时被改动。因而大大降低了程序的可读性和可维护性。
    不过不要紧,下面提到的方法将会解决这个问题。

三、队列

    LabVIEW 中有一套操作队列的函数。


图2:队列的函数选板

    LabVIEW 中的队列是双向队列,堆栈也可以使用它。它与其它语言中的队列一样,为数据数据提供了存入取出的操作。一般用于不同线程、不同设备等之间通讯时数据的缓存。
    但 LabVIEW 中的队列它有其特殊性。其他语言中,队列主要作为一种数据结构,是一种便捷的在内存中保存需要顺序处理的数据的方式。在 LabVIEW 中,队列更主要的应用于在不同的线程间的数据交换。因此,队列不同于LabVIEW中大多数的数据类型,它是传引用的。这样才能在不同的线程内对同一个队列进行操作。

    我们可以借助队列,使任意一种类型的数据按照传引用的方式传递。其思路是:创建一个新的只有一个元素的队列,把数据作为这个队列的元素。平时在 VI 间传递参数时,传递的是这个队列。需要时,再把数据从队列中取出使用。下图是初始化一个这样的传引用数据的代码:

 
图3:创建一个传引用的数据

    传引用通常都是用于在不同线程里访问同一份数据,所以在访问数据时要防止出现竞争状态。一个数据处理的 VI(假设名为A),第一步操作就应当是用“Dequeue Element”把队列中唯一的元素取出。在 VI (A)所有工作都完成后,再让新的数据重新入队。这样一来,程序执行到VI(A)时,队列立即被清空。其它线程内若有 VI (假设名为B)准备同时处理同一数据,此时它已经无法从空队列中取出所需的数据。它只能暂时等待,直到 VI(A )完成所有工作,再次把数据放回队列,VI(B) 才能继续执行。这样就避免了同一数据被同时访问而引发的竞争状态。
    下图就是一段处理数据的示例代码:

 
图4:清空队列、处理数据、重新入队

    (有人问起,代码中那个黄色可框是什么。它是缓存重用结构。)
    使用传引用,就必须自己管理内存了:当数据不再使用时必须把创建的队列销毁,否则可能会引起内存泄漏。
    这里可以下载一个完整的借用队列传应用的演示程序

四、借助 C 语言

    借助 C 语言比借助队列实现传引用要麻烦一些,所以这不是一个首选方案。但是,如果软件中已经有部分模块是使用 C 语言编写的,并且所传递的数据在 C 代码中和 LabVIEW 代码中都会使用到,也可以考虑把数据存放在 C 语言实现的模块中。
    这种做法的思路是,数据存放在 C 语言开辟的内存空间里。C 语言把数据的内存地址传给 LabVIEW。平时在 VI 间传递参数时,传递的是这个地址的数值。需要时,再把数据从内存中读到 LabVIEW 里使用。

    在下图的小猪的演示程序中使用到了这种传数据引用方法。下图是演示程序中创建数据引用的VI:Pig.lvlib:New.vi

    先不去考虑这个例子中的数据具体是什么,值分析一下它如何构造数据的引用:在这个 VI 的正中间是一个显示为“NEW INDEX”的VI。它的功能是把一段数据放置在C语言中开辟的内存里,然后返回保存数据的内存地址。内存地址用I32整数类型标识。以后在每个子 VI 间传递的数据就是这个内存地址的值。
    你可能已经注意到,程序把这个内存地址又强制转换成了一个 Refnum 数据类型。这不仅是为了看着舒服(LabVIEW 中的传引用大多使用这种数据类型),更是因为使用自定义的 Refnum 类型,比整数有更高的安全性。例如你的程序中有不同的几块数据都采用这种放法保存在C语言开辟的内存中,使用不同的 Refnum 类型可以分别地将它们区分开来,避免直接把地址值传递给需要使用另一块数据的 VI。(这个技巧留待以后详细解释:)

《我和 LabVIEW》目录