Generics 关于带有受保护对象的Ada通用包的新手问题
我仍在学习使用该语言,因此这些都是新手问题,我希望对其他人也有用: 在来自rmit.edu.au的Dale Stanbrough的示例中: ===已编辑=== 代码是有效的,但我有以下问题: 这是将通用包与受保护对象一起使用的正确方法吗? 如果不是,那么实例化有界缓冲区对象的正确方法是什么 ==编辑2-澄清=== 我想问的是:我是否无意中将所有数据(包括可能很大的缓冲区)分配了两次?一次在包Generics 关于带有受保护对象的Ada通用包的新手问题,generics,ada,Generics,Ada,我仍在学习使用该语言,因此这些都是新手问题,我希望对其他人也有用: 在来自rmit.edu.au的Dale Stanbrough的示例中: ===已编辑=== 代码是有效的,但我有以下问题: 这是将通用包与受保护对象一起使用的正确方法吗? 如果不是,那么实例化有界缓冲区对象的正确方法是什么 ==编辑2-澄清=== 我想问的是:我是否无意中将所有数据(包括可能很大的缓冲区)分配了两次?一次在包my\u buffer\u实例的实例化中,第二次在my\u buffer定义中 我的理解是,new Bou
my\u buffer\u实例的实例化中,第二次在my\u buffer
定义中
我的理解是,new Bounded\u Buffer\u Package
仅定义类型,Bounded\u Buffer
但在正确使用类型之前不分配内存吗 受保护对象旨在用作任务之间的共享数据。您的示例的主要任务是调用put和get。受保护对象的预期用途应至少有一个任务作为生产者调用Put条目,以及一个或多个任务作为使用者调用Get条目。受保护的对象将为您处理所有的锁定和任务队列问题。我忍不住觉得有界缓冲区\u包
(顺便问一下,为什么要添加\u包
?只需再添加8个字符以供眼睛跳过)可以进行更多的信息隐藏!用户不需要知道PO内部使用的类型和子类型
这不是你问题的重点。声明受保护对象时,缓冲区确实是保留的;泛型实例化可能会保留一些字节(例如,用于精化检查),但不会保留缓冲区
声明对象而非类型的泛型肯定会在实例化时为该对象保留空间。@KenWhite-感谢您的通信,问题的措辞已被重新表述,只出现了主要问题。谢谢您的回答。我确实理解受保护数据的用途(主要任务是查看我是否可以访问这些方法),我的问题是关于包实例化期间发生了什么-我已经对原始问题进行了澄清,我希望我的问题现在更清楚。
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;