2011-09-07 101 views
4

據我瞭解,小梅在其枚舉類型使用基於0的指標。所以在下面Status_Type,序號值從0到5阿達枚舉類型範圍

type Status_Type is 
    (Undefined, 
     Available, 
     Fout,  
     Assigned,  
     Effected, 
     Cleared); 

我的問題是什麼..下面的例子是序數值嗎?它們是從0開始還是從超級類型的序數值開始?

subtype Sub_Status_Type is Status_Type 
    range Available.. Effected; 

    subtype Un_Status_Type is Sub_Status_Type 
    range Fout .. Assigned; 

Sub_Status_Type序數值是從1到4還是從0到3?

Un_Status_Type序數值是從3到4還是從1到2或從0到1?

+0

通常最好從源文件複製並粘貼您的實際代碼。我怎麼知道你沒有?因爲'out'是一個保留字。 –

+0

...這是如何改變什麼... – systemoutprintln

+0

它可能不會在這種情況下,但我已經看到很多問題,因爲海報重新鍵入代碼而不是複製 - 粘貼它。如果有人想編譯你的代碼來測試它也很有幫助。 –

回答

8

對於子類型,'pos將返回與基類型相同的值(我相信分別爲1..4和2..3)。亞型並不是真正的新型和不同類型,儘管它們是相同的舊型,但對其可能的值有一些額外的限制。

但應該注意的是,這些值是在場景下分配的。 除非您使用的是'val'pos屬性,或者您正在與Ada(或硬件)之外編寫的代碼接口,否則它們確實應該對您沒有任何影響

另外,如果它確實結束了事情,你應該知道情況實際上要複雜得多。 'pos'val不會返回編譯器在生成代碼時使用這些枚舉值的實際位值。他們只是返回他們的「序位」;他們偏離了第一個價值。

默認情況下它們通常是相同的東西。但是,可以改變賦值(但不是順序位置分配)自己一個for ... use子句,像在下面的代碼:

for Status_Type use 
(Undefined => 1, 
    Available => 2, 
    Out  => 4,  
    Assigned => 8,  
    Effected => 16, 
    Cleared => 32); 
+0

但枚舉表示子句不影響「Pos」的行爲; 'Status_Type'Pos(Cleared)'仍然是5.除非自上一次查看以來已經添加了一些內容,否則沒有乾淨的方法來獲取枚舉常量的表示編號('Unchecked_Conversion'可以做到這一點,但確定適當的目標類型是非平凡的)。 –

+0

確實如此。它對於語言和H/W界面非常重要,但不是'Pos /'Val。我會盡力澄清,如果我能找到一種方法來做到這一點,而不是將我的答案翻倍。 –

5

位置號在基本類型的定義。所以Sub_Status_Type'Pos(Assigned)是一樣的Status_Type'Pos(Assigned),和Sub_Status_Type的位置值從1到4,而不是0到3

(請注意,該位置號碼不受枚舉表示子句;它總是起始於0代表基本類型的第一個值)。

順便提一句,通過運行一個打印Sub_Status_Type'Pos(...)值的小測試程序可以很容易地發現 - 這也會告訴你, t使用保留字out作爲標識符。

1

我想回答你的問題,最好的辦法是在反向:

A亞型是,從數學上講,它的父類的連續子集。因此,如果類型SIZES是(1,2,3,4,5,6,7,8),並且將子類型MEDIUM定義爲(4,5),則MEDIUM的第一個元素爲4. 示例:

Type Small_Natural is 0..16; 
Subtype Small_Positive is Small_Natural'Succ(Small_Natural'First)..Small_Natural'Last; 

這定義了兩組緊密相關的可能值的小集合:即正數都是自然數保存零。

我用這種形式來說明,通過對我們下面的例子中的幾個文本的變化:

Type Device is (Not_Present, Power_Save, Read, Write); 
Subtype Device_State is Device'Succ(Device'First)..Device'Last; 

在這裏,我們正在建模的直觀概念,即設備必須存在有一個狀態,但請注意,子類型ARE中的​​值[精確地說]是它們派生類型中的值。

這會回答你的第二個問題:是的,枚舉元素將具有與其父類型相同的值。對於第一個,我相信起始位置實際上是實現定義的(如果不是,那麼我假設LM 默認它爲0)。不過,您可以自由地覆蓋它並提供自己的編號,唯一的限制是枚舉中的元素的價值低於您當前分配的值[IIRC]。

2

據我瞭解,小梅在其枚舉類型

是,它使用0索引,或者更確切地說,該類型的值的position使用0基於索引。這是而不是枚舉文字的值,而不是它們的二進制表示。

以下示例的序數值是什麼?

沒有「序數」值。該類型的值是您指定的值。你在這裏混淆了「價值」,「表象」和「位置」。

Status_Type的值是UndefinedAvailableOutAssignedEffectedCleared

職位是0,1,2,3,4和5.這些是你可以用來翻譯'Pos and 'Val

representation默認爲該位置,但您可以自由分配其他值(只要保持正確的順序)。如果將它寫入文件,或通過套接字發送,或將其加載到寄存器中,則會使用它們。

+1

'自由',只是表示值需要與枚舉值相同(不太確定爲什麼,但請參閱http://www.adaic.org/resources/add_content/standards/05rm/html/RM-13 -4.html para 6/2。 –

+0

是的,忘了那個..固定! – oenone