[英]Newbie question on Ada generic package with a protected object [on hold]
我還在學習使用這種語言,所以這些都是新手問題,我希望這些問題對其他人也有用:
在來自rmit.edu.au的Dale Stanbrough的一個例子中: Link
generic
type Item is private;
Maximum_Buffer_Size : in Positive;
package Bounded_Buffer_Package is
subtype Buffer_Index is Positive range 1..Maximum_Buffer_Size;
subtype Buffer_Count is Natural range 0..Maximum_Buffer_Size;
type Buffer_Array is array (Buffer_Index) of Item;
protected type Bounded_Buffer is
entry Get (X : out Item);
entry Put (X : in Item);
private
Get_Index : Buffer_Index := 1;
Put_Index : Buffer_Index := 1;
Count : Buffer_Count := 0;
Data : Buffer_Array;
end Bounded_Buffer;
end Bounded_Buffer_Package;
-------------------------------------------------------------
package body Bounded_Buffer_Package is
protected body Bounded_Buffer is
entry Get (X : out Item) when Count > 0 is
begin
X := Data(Get_Index);
Get_Index := (Get_Index mod Maximum_Buffer_Size) + 1;
Count := Count - 1;
end Get;
entry Put (X : in Item) when Count < Maximum_Buffer_Size is
begin
Data(Put_Index) := X;
Put_Index := (Put_Index mod Maximum_Buffer_Size) + 1;
Count := Count + 1;
end Put;
end Bounded_Buffer;
end Bounded_Buffer_Package;
我用過如下包:
with Text_IO; use Text_IO;
with Bounded_Buffer_Package;
procedure test_buffer is
package my_buffer_instance is new Bounded_Buffer_Package(Item => Integer, Maximum_Buffer_Size =>100);
my_buffer : my_buffer_instance.Bounded_Buffer;
val : Integer;
begin
my_buffer.Put(17);
my_buffer.Get(val);
Put_line(Integer'Image(val));
end test_buffer;
====編輯===
代碼有效,但我有以下問題:
這是使用受保護對象的通用包的正確方法嗎? 如果沒有,實例化有界緩沖區對象的正確方法是什么?
===編輯2 - 澄清===
我想問的是:我是否無意中兩次分配所有數據(包括可能很大的緩沖區)? 一旦進入包my_buffer_instance
的實例化,第二次進入my_buffer
定義?
我的理解是new Bounded_Buffer_Package
只定義了類型Bounded_Buffer
但是在類型使用正確之前不分配內存?
我不禁感覺到Bounded_Buffer_Package
(順便說一下,為什么要添加_Package
?只需添加另外8個字符讓眼睛跳過)可以用更多的信息隱藏! 用戶無需了解PO內部使用的類型和子類型。
這不是你的問題的重點。 當聲明受保護對象時,緩沖區確實被保留; 通用實例化可以保留幾個字節(例如,與精化檢查有關)但不保留緩沖區。
聲明對象而不是類型的泛型肯定會在實例化時為該對象保留空間。
受保護對象旨在用作任務之間的共享數據。 您的示例主要任務是調用put和get。 受保護對象的預期用途應該至少有一個任務作為生產者,調用Put條目,以及一個或多個作為消費者的任務,調用Get條目。 受保護對象將為您處理所有鎖定和任務排隊問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.