問題描述:LabVIEW中有一種特殊的數(shù)據(jù)類型叫做變體。LabVIEW官方將變體成為可以容納所有數(shù)據(jù)類型的一個容器,可以傳入幾乎所有的數(shù)據(jù)類型,比如可以將某個數(shù)值轉(zhuǎn)換為變體,然后再通過相應的變體至數(shù)值轉(zhuǎn)換即可得到原來的值了。變體有許多很好的用處,但是編程也容易出現(xiàn)問題的,下面就一點點實踐上的問題做下記錄。 什么是變體:變體其實存儲了兩部分內(nèi)容,第一部分是數(shù)據(jù)類型的描述,第二部分就是數(shù)值本身的存儲了,因此在將數(shù)據(jù)類型的值轉(zhuǎn)為變體時,不僅存儲了該值,還有相應類型的描述。在從變體轉(zhuǎn)為數(shù)據(jù)類型時,需要知道原來的數(shù)據(jù)類型,然后與之匹配轉(zhuǎn)換出原值。這個功能看似將數(shù)據(jù)轉(zhuǎn)來轉(zhuǎn)去,多此一舉,而且數(shù)據(jù)類型弄錯就會導致錯誤的數(shù)據(jù),但是變體是非常有用的,就像C語言中的萬能指針一樣,當不確定需要傳入的數(shù)據(jù)為何種類型時,其使用價值就體現(xiàn)出來了??赡躄abVIEW更多的像C語言一些,雖然現(xiàn)在也有面向?qū)ο蟛糠值墓δ埽珨?shù)據(jù)流的形式更加接近于過程控制。 變體用在何處:上面的在傳入數(shù)據(jù)類型不確定時使用變體很有用是一點,另外一點就是對ActiveX控件數(shù)據(jù)的傳輸,比如MSCOMM控件,還有數(shù)據(jù)庫相關的DCT工具中數(shù)據(jù)的存取等,都用到的是變體。 變體使用的最大問題:最大的問題應該就是數(shù)據(jù)類型的確定了,這也是變體的本身的屬性決定的。許多時候比如在使用ActiveX控件的時候,并不知道變體是如何將數(shù)據(jù)轉(zhuǎn)換成更加底層的數(shù)據(jù)的,也就是只要使用到變體至數(shù)值或者是數(shù)值至變體中的一個,變體是從ActiveX中傳來的,這時就必須詳細的了解該ActiveX變體所支持的數(shù)據(jù)類型了,否則編程中會出現(xiàn)非常奇怪的數(shù)據(jù)錯誤問題。比如該ActiveX控件的變體只支持字符串和一維字節(jié)數(shù)組的傳入,但由于沒有了解到這一點,在編程時給ActiveX控件變體傳入了float型數(shù)值,程序上并沒有錯誤,但是ActiveX控件得到的數(shù)據(jù)并非需要的,經(jīng)過轉(zhuǎn)換后得到的是錯誤的數(shù)值,結(jié)果就出現(xiàn)莫名其妙的問題了。 變體的特點:因此變體使用靈活,但是在沒有完全了解其數(shù)據(jù)類型轉(zhuǎn)換的情況下使用也是容易出問題的。