2012-02-21 18 views
0

私は、手続きや関数とエイダにシンプルなパッケージを持っています。私はすべての関数とプロシージャを保護された型にしたいと思っています。エイダ保護タイプ

シンプル.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')。そして、他の2つのサブプログラムでは、Bがレコード型のように見えます。予約語 'body'はパッケージ仕様に現れません。 –

+1

1>これは有効なAdaコードではありません。 2>並行処理で保護された型を意味しましたか? http://en.wikipedia.org/wiki/Ada_%28programming_language%29#Concurrency – NWS

答えて

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です。次の2つのタスクが「同じ」時IncrementBy => 3と1とBy => 4を持つものを、呼び出す場合Valueは体が

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; 
のようになります。7.

ずつ増加してしまうことを確認したいです

推奨読書:保護されたタイプのWikibooks section

+0

+私よりも良いリンクの場合: – NWS

+0

パッケージ本体の中に保護されたオブジェクトを隠すこともできますスペック・ファイル内のラッパー・サブプログラムの仕様 – oenone