oop_generic #24
Replies: 2 comments 3 replies
-
老师你好,我这边用teststand做测试,然后如果如果中间通讯出现错误,就会报错,这个能解决吗 |
Beta Was this translation helpful? Give feedback.
-
之前博客上的相关文章,搬到这里: LabVIEW 中的泛型容器Google 网站里有个 Google 实验室,有不少 Google 的产品最初就是放在这个实验室里的。现在 NI 也有 NI 实验室了。NI 实验室公布出来的项目一般是 NI 工程师利用额外时间做的一些调查研究。这些项目不是公司的正式产品,但是它们的设计很有创新或者是比较有应用潜力。与其让这些项目被埋没了,不如先看看用户对这些项目的反应,如果相当一部分用户觉得某个项目非常有帮助,或许它就值得我们为其增加投资,把它作成正式产品了。 我这里给大家介绍其中的一个项目:“LabVIEW Generic Container Map”。因为这个项目是我设计的,所以对它了解比较多一些。当时,我们打算提出这个项目的时候,主要有两个目的:第一是帮助用户编写有复杂数据结构的应用程序;第二是推进 LabVIEW 向通用编程语言方向做改进。 C++ 的程序员基本都很喜欢 STL 这个模板库。程序中常会使用数组、队列、字符串等等数据类型和结构,如果自己设计实现这些数据结构和相关的操作,是相当耗费精力的。好在 STL 实现了这些数据结构,和它们常用的操作方法。借用 STL 提供的功能,编程时很多细节方面不需要再去考虑了,这就让工作简化了许多。尝到 STL 甜头的程序员,在编写程序的时候,已经很难离开 STL 了。 STL 中非常重要的一个部分就是容器。容器用于存放数据,程序通过调用容器的结构函数保存数据到容器或者访问容器中的数据。容器也分为不同的类型,如链表、队列等。它们在数据的组织方式上,或存取方式上有所分别,以适用不同的需求。STL 中的容器和方法都是泛型的或者说是数据类型无关的,就是说这些容器可以保存和操作任何类型的数据。 其它一些常用的编程语言,如 Java、C# 也都有类似的泛型容器以方便程序员使用。 LabVIEW 的主要方针是简化工程师们编写程序的难度,以前用 LabVIEW 编写的程序大多是工业领域流程控制类型的。这种类型的程序用不到太复杂的数据结构和算法,因此,LabVIEW 中对我们在计算机课程中学到的那些经典数据结构以及算法的支持并不多。 但是在我自己用 LabVIEW 多了之后,用它比用 C++ 要顺手,任何类型的程序都喜欢使用 LabVIEW 来编写,包括一些通常用途的程序。这时候,LabVIEW 缺乏对基本数据类型支持的缺点就格外突出了。于是我和周围几个同事就想到应该在这些方面对 LabVIEW 做一些补充,做一些比较规范的泛型容器和算法,一方面方便自己,也许还可以提供给别的用户。 由于这不是正式项目,我们能投入的资源很有限,不可能一开始就做得很全面。作为开始,我们选择了 Map 容器和它最常用的几个方法。首先选择 Map 一是因为它比较常用,二是其它容器中,有些在概念上和 LabVIEW 中已有的一些函数比较接近,如果选则他们,可能会引起用户的误解。 LabVIEW 中的 Array 操作与 STL 中的 vector 是非常相似的,功能齐全,不需要考虑底层操作如内存管理等。STL 中的 deque, queue, stack 等,与 LabVIEW 中的“队列”(Queue)操作比较类似。但是 LabVIEW 中的队列存在的目的不是为了作容器,而是用于在多线程程序中通讯。在“生产者/消费者”程序模式中,经常使用队列在不同的线程中传递数据或消息。因为 LabVIEW 中队列操作主要用于不同线程间的通讯,因此它的函数并没有采用 LabVIEW 的主要传参方式-传数据,而是采用了传引用的方式。 我们实现的这个 Map(这个按字面翻译比较别扭,中文可能翻译成“字典”还比较合理)泛型容器功能与 C++ STL 中的 Map 是类似的,它主要用于程序经常需要按某一关键字查询数据的情况。 Map 已经包括了编写查询程序时常用的操作,比如把数据放到容器中、查找一个数据、删除、清空容器等。 我们的 LabVIEW Generic Container Map 内部的数据是按照平衡二叉树的方式组织存储的,它的查询复杂度比一般线性数据结构的要低。这样,在数据量很大的情况下,使用 Map 的程序效率明显高于使用数组的程序。 Map 采用的是符合 LabVIEW 风格的传数据方式,把整个 Map 中的数据在不同函数间传递。 C++ 是支持泛型编程的。简单地说,泛型编程可以这样理解,就是程序员可以实现一个方法,这个方法能够应用在任何合法的数据类型上。比如,前面提到的 STL,它有个“比较”方法,你可以用它来比较整数,也可以比较字符串,或者使用户定义的类的实例等等。 支持泛型编程,程序员就可一抽象出与数据类型无关的算法,从而使代码具有更好的可重用性。 目前,用户还不能在 LabVIEW 上实现泛型编程。使用 Polymorphic VI 可以使一个方法支持某几种特定的数据类型,但不是任何数据类型。真正能做到数据无关的函数,比如说“equal”函数,都是 LabVIEW 自带的,用户无法写出这样一个函数或 VI。 我是非常想推动 LabVIEW 有朝一日也实现泛型编程的。这个 Map 容器也是在 LabVIEW 泛型编程方面做的一次探索。这个 Map 容器不是 LabVIEW 自带的东西,它是完全使用 G 代码实现的。但是它同时也是一个泛型容器,支持对任何数据类型的操作。 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
泛型编程
https://lv.qizhen.xyz/oop_generic
Beta Was this translation helpful? Give feedback.
All reactions