2012-02-21 85 views
0

我在程序和函數中有一個簡單的Ada包。我想要所有的功能和程序在一個受保護的類型。Ada保護類型

例如一個簡單的文件名.adb

package body Pack is 

    procedure procedure1 (B : in out Integer) is 
    begin 
    B := new Integer; 
    end procedure1; 

    procedure procedure2 (B: in out Integer) is 
    begin 
    B.Cont(B.First-1) := 1; 
    end procedure2; 

    function procedure3 (B : Integer) return Boolean is 
    begin 
    return B.First = B.Last; 
    end procedure3; 

end pack; 

和或簡單.ads

package body Pack is 

    procedure procedure1 (B : in out Integer); 

    procedure procedure2 (B: in out Integer); 

    function procedure3 (B : Integer) return Boolean; 

end pack; 

我會怎麼做呢?

+1

該代碼距離編譯很遠。在'procedure1'中,B被聲明爲'Integer',但是你爲它賦了一個訪問值('new Integer')。而在其他兩個子程序中,B似乎是一種記錄類型。保留字'body'不能出現在包規範中。 – 2012-02-21 14:11:41

+1

1>這是無效的Ada代碼。 2>你的意思是在併發中使用受保護的類型嗎?如果是這樣,請閱讀:http://en.wikipedia.org/wiki/Ada_%28programming_language%29#Concurrency – NWS 2012-02-21 14:17:37

回答

5

有關受保護類型的事情是它保護了某些內容(針對併發訪問)。從代碼中很難看到你想保護的是什麼。

比如說,如果你想做一個線程安全的增加,您可能有

package Pack is 
    protected type T is 
     procedure Set (To : Integer); 
     procedure Increment (By : Integer); 
     function Get return Integer; 
    private 
     Value : Integer := 0; 
    end T; 
end Pack; 

一個規範(這是遠遠不夠完善;要能夠指定初始Value當你聲明一個T,但這開始變得複雜)。

在這種情況下,要保護的東西是Value。你要確保,如果兩個任務調用Increment在「相同」的時候,一個與By => 3和一個與By => 4,該Value結束了由7

遞增人體可能看起來像

package body Pack is 
    protected body T is 
     procedure Set (To : Integer) is 
     begin 
     Value := To; 
     end Set; 
     procedure Increment (By : Integer) is 
     begin 
     Value := Value + By; 
     end Increment; 
     function Get return Integer is 
     begin 
     return Value; 
     end Get; 
    end T; 
end Pack; 

推薦閱讀:關於受保護類型的Wikibooks section

+0

+ 1爲了比我的更好的鏈接:) – NWS 2012-02-21 14:26:29

+0

你甚至可以隱藏在包體內的受保護的對象,只是保持spec文件中包裝子程序的規格。 – oenone 2012-02-23 07:27:39