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