Ada數(shù)據(jù)類型屬性、類型限制和類型轉(zhuǎn)換

2018-10-25 10:48 更新

數(shù)據(jù)類型屬性,表示某個(gè)數(shù)據(jù)類型的具體特征---取值范圍,最小值,最大值,某數(shù)在該類型中的位置 …… 應(yīng)該說(shuō)是相當(dāng)有用的-----起碼不像 C 語(yǔ)言,還要翻翻系統(tǒng)手冊(cè)才能知道某個(gè)數(shù)據(jù)類型的具體定義。這些屬性的用法和調(diào)用函數(shù)一樣,也可以認(rèn)為它們就是預(yù)定義的函數(shù)----雖然不怎么準(zhǔn)確,有些返回值為通用類型(universal type)和字符串型。

數(shù)據(jù)類型的屬性既可以使用預(yù)先定義的操作,也可以自己定義數(shù)據(jù)類型的屬性,如S'First 是返回 S 類型的下限,如果用戶不滿意默認(rèn)的屬性,也可自己指定S'First(雖然沒(méi)必要),如:

for S'First use My_Version_First;

My_Version_First 是用戶自己的函數(shù),以后當(dāng)使用 S'First 時(shí),實(shí)際上調(diào)用 My_Version_First;有些數(shù)據(jù)屬性也可以直接用數(shù)字標(biāo)示,如:

for S'First use 0;

這樣,S'First 的值就成了0。在很多地方,如內(nèi)存管理中,這種用法還是比較普遍的。下面簡(jiǎn)單地列出標(biāo)量類型的屬性,S 表示某個(gè)標(biāo)量類型:

通用標(biāo)量類型屬性

S'First 返回 S 類型的下限,返回值為 S 型。

S'Last 返回 S 類型的上限,返回值為 S 型。

S'Range 返回 S 類型的取值范圍,即 S'First .. S'Last。

S'Base 表示 S 類型的一個(gè)子類型,但沒(méi)有范圍限制(單純從取值范圍角度講,“兒子”反而比“父母”大),稱之為基類型(base type)。

S'Min 函數(shù)定義為: function (Left,Right:S'Base) return S'Base 。比較 Left和 Right 的大小,返回較小值。如:Integer'Min (1 , 2) = 1 。

S'Max 函數(shù)定義為: function (Left,Right:S'Base) return S'Base 。比較 Left和 Right 的大小,返回較大值。如:Integer'Max (1 , 2) =2 。

S'Succ 函數(shù)定義為:function S'Succ (Arg :S'Base) return S'Base 。返回 Arg 的后趨。

S'Pred 函數(shù)定義為: function S'Pred (Arg :S'Base) return S'Base 。返回 Arg的前趨。

S'Wide_Image 函數(shù)定義為:function S'Wide_Image (Arg : S'Base) return Wide_String 。返回 Arg 的“像”,即可顯示的字符串,這里返回寬字符串型 Wide_String。如:Float'Wide_Image (9.00) = “9.00" 。詳見(jiàn) 第三章 數(shù)組。

S'Image 與 S'Wide_Image 一樣,但返回字符串型 String 。

S'Wide_Width 表示 S'Wide_Image 返回的字符串的最大長(zhǎng)度,返回值為 universal_integer。

S'Width 表示 S'Image 返回的字符串的最大長(zhǎng)度,返回值為 universal_integer。

S'Wide_Value 函數(shù)定義為: function S'Wide_Value ( Arg : Wide_String) return S'Base。是 S'Wide_Image 的逆過(guò)程,返回與“像”Arg 相對(duì)應(yīng)的 S 類型的值。如: Float'Wide_Value ("9.00") = 9.00 。

S'Value 與 S'Value 一樣,但參數(shù) Arg 是 String 類型。

通用離散類型屬性

離散類型包括整型和枚舉型,除了上述的屬性外,還有:

S'Pos 函數(shù)定義為: function S'Pos (Arg : S'Base) return universal_integer。返回 Arg 在 S 類型中的位置。

S'Val 函數(shù)定義為: function S'Pos (Arg : S'Base) return S'Base。返回 在 S 類型中位置為 Arg 的值。

例如:

type Color is (red, white, blue);
Color'Pos (White) = 2
Color'Val (1) = red

浮點(diǎn)類型屬性

S'Digits  返回 S 類型的精度,為 universal_integer 類型。

定點(diǎn)類型屬性

S'Small 返回 S 類型的 small 值,返回值為實(shí)型。

S'Delta 返回 S 類型的 delata,返回值為實(shí)型。

S'Fore  返回 S 類型所表示數(shù)的小數(shù)點(diǎn)前面的最小字符數(shù)量,返回值類型 universal_integer。

S'Alt 返回 S 類型所表示數(shù)的小數(shù)點(diǎn)后面的最小字符數(shù)量,返回值類型 universal_integer。

十進(jìn)制定點(diǎn)型屬性

十進(jìn)制定點(diǎn)型屬性

S'Digits 返回 S 類型的精度。

S'Scale 返回 S 類型的標(biāo)度 N,使 S'Delta=10.0**(-N)。

S'Round 函數(shù)定義為 function S'Round(X:universal_real) return S'Base;返回 X 的舍入值。

2.6 類型限制和類型轉(zhuǎn)換(Type Qualification and Type Conversion)

先讓我們看一下下面的例子:

type primary is (red, green, blue);
type rainbow is (red, yellow, green, blue, violet);
...
for i in red..blue loop
...

這里明顯有歧義,編譯器也就無(wú)法自動(dòng)判定 red,blue 到底是 primary 還是 rainbow 中的元素。因此我們就需要使用類型限制,精確指明元素:

for i in rainbow'(red)..rainbow'(blue) loop

for i in rainbow'(red)..blue loop -- 只需要一個(gè)限制

for i in primary'(red)..blue loop

類型限制并不改變一個(gè)值的類型,只是告訴編譯器程序員所期望的數(shù)據(jù)類型。由于 Ada 中提供了重載等特性,變量、子程序等重名的現(xiàn)象相當(dāng)普遍,以后我們會(huì)碰到,解決方法和現(xiàn)在所講的類型限制差不多,都是指明資源的準(zhǔn)確位置。

類型轉(zhuǎn)換我們也常常在使用,比方說(shuō) modular 類型的數(shù)的輸入輸出需要特定的程序包,初學(xué)者便可以將 modular 數(shù)轉(zhuǎn)換成 Integer 數(shù)來(lái)處理(雖然不怎么好)。下面是一個(gè) Integer 和 Float 類型數(shù)互相轉(zhuǎn)換的例子:

X : Integer:= 4;
Y : Float;
Y := float(X);
. . .
X := Integer(Y);

這導(dǎo)致編譯器插入合適的代碼來(lái)做類型轉(zhuǎn)換,實(shí)際效果就取決于編譯器,而且一些類型之間的轉(zhuǎn)換是禁止的;像上述的強(qiáng)行轉(zhuǎn)換一般也不推薦,除非意義很明確,建議是使用上節(jié)所講的數(shù)據(jù)類型屬性、以及以后會(huì)碰到的相關(guān)子程序等來(lái)進(jìn)行類型轉(zhuǎn)換。

還有一種不進(jìn)行檢查的類型轉(zhuǎn)換,我們會(huì)在以后遇到。

類型限制和類型轉(zhuǎn)換

先讓我們看一下下面的例子:

type primary is (red, green, blue);
type rainbow is (red, yellow, green, blue, violet);
...
for i in red..blue loop
...

這里明顯有歧義,編譯器也就無(wú)法自動(dòng)判定 red,blue 到底是 primary 還是 rainbow 中的元素。因此我們就需要使用類型限制,精確指明元素:

for i in rainbow'(red)..rainbow'(blue) loop
for i in rainbow'(red)..blue loop -- 只需要一個(gè)限制
for i in primary'(red)..blue loop

類型限制并不改變一個(gè)值的類型,只是告訴編譯器程序員所期望的數(shù)據(jù)類型。由于 Ada 中提供了重載等特性,變量、子程序等重名的現(xiàn)象相當(dāng)普遍,以后我們會(huì)碰到,解決方法和現(xiàn)在所講的類型限制差不多,都是指明資源的準(zhǔn)確位置。

類型轉(zhuǎn)換我們也常常在使用,比方說(shuō) modular 類型的數(shù)的輸入輸出需要特定的程序包,初學(xué)者便可以將 modular 數(shù)轉(zhuǎn)換成 Integer 數(shù)來(lái)處理(雖然不怎么好)。下面是一個(gè) Integer 和 Float 類型數(shù)互相轉(zhuǎn)換的例子:

X : Integer:= 4;
Y : Float;
Y := float(X);
. . .
X := Integer(Y);

這導(dǎo)致編譯器插入合適的代碼來(lái)做類型轉(zhuǎn)換,實(shí)際效果就取決于編譯器,而且一些類型之間的轉(zhuǎn)換是禁止的;像上述的強(qiáng)行轉(zhuǎn)換一般也不推薦,除非意義很明確,建議是使用上節(jié)所講的數(shù)據(jù)類型屬性、以及以后會(huì)碰到的相關(guān)子程序等來(lái)進(jìn)行類型轉(zhuǎn)換。

還有一種不進(jìn)行檢查的類型轉(zhuǎn)換,我們會(huì)在以后遇到。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)