Generics 关于带有受保护对象的Ada通用包的新手问题

Generics 关于带有受保护对象的Ada通用包的新手问题,generics,ada,Generics,Ada,我仍在学习使用该语言,因此这些都是新手问题,我希望对其他人也有用: 在来自rmit.edu.au的Dale Stanbrough的示例中: ===已编辑=== 代码是有效的,但我有以下问题: 这是将通用包与受保护对象一起使用的正确方法吗? 如果不是,那么实例化有界缓冲区对象的正确方法是什么 ==编辑2-澄清=== 我想问的是:我是否无意中将所有数据(包括可能很大的缓冲区)分配了两次?一次在包my\u buffer\u实例的实例化中,第二次在my\u buffer定义中 我的理解是,new Bou

我仍在学习使用该语言,因此这些都是新手问题,我希望对其他人也有用:

在来自rmit.edu.au的Dale Stanbrough的示例中:

===已编辑===

代码是有效的,但我有以下问题:

这是将通用包与受保护对象一起使用的正确方法吗? 如果不是,那么实例化有界缓冲区对象的正确方法是什么

==编辑2-澄清===

我想问的是:我是否无意中将所有数据(包括可能很大的缓冲区)分配了两次?一次在包
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;