Ada-不受约束的对象的队列数组导致Storage_Error-如何解决?

时间:2019-03-01 20:11:30

标签: arrays generics containers ada variant

因此,免责声明,我现在仅使用Ada已有几周了……我希望这是一个菜鸟错误。

所以我有(匿名)代码...

with Ada.Text_IO; use Ada.Text_IO;

with Ada.Containers.Synchronized_Queue_Interfaces;
with Ada.Containers.Bounded_Synchronized_Queues;

procedure Hello is
  type ID_Type is ( Invalid_Id,
                    Config_Id);

  for ID_Type use ( Invalid_Id => 16#00#,
                    Config_Id => 16#11#  );
  for ID_Type'Size use 8;                  

  type Config_Type is 
    record
      data : Integer;
    end record;

  type Data_Type (i : ID_Type := Invalid_Id) is 
    record
      Id : ID_Type := i;

      case i is
        when Invalid_Id => null;
        when Config_Id => config : Config_Type;
        when others => null;
      end case; 
    end record with Unchecked_Union, Convention => C;

  package Queue_Interface is
    new Ada.Containers.Synchronized_Queue_Interfaces(Data_Type);

  package Data_Queue is 
    new Ada.Containers.Bounded_Synchronized_Queues
      ( Queue_Interfaces => Queue_Interface,
        Default_Capacity => 1);

  Queue_Array : array(1..1) of Data_Queue.Queue;

begin

  Put_Line("Queue_Array(1)'Size = " & Integer'Image(Queue_Array(1)'Size));

end Hello;

在在线编译器(GNAT 7.1.1)上,这会触发:提高了STORAGE_ERROR:s-intman.adb:136明确提高

预期用途是与C级驱动程序对接,以从串行端口提取数据。 (因此,unchecked_union和其他表示形式的子句)

尝试使用Indefinite_Holder进行包装,假设不确定的问题来自Unconstrained类型...并遇到相同的错误。以为我不需要它,因为尽管它是不受限制的变体,但是它的大小是确定的。无论哪种方式都一样。

还值得注意的是:     test1:数组(ID_Type)数据类型; -作品     test2:Data_Queue.Queue; -作品     test3:数组(1 .. 2)Data_Queue.Queue; -Storage_Error

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

Bounded_Synchronized_Queue的定义是

 protected type Queue
    (Capacity : Count_Type := Default_Capacity;
     Ceiling  : System.Any_Priority := Default_Ceiling)
       with Priority => Ceiling is
    new Queue_Interfaces.Queue

GNAT似乎正在尝试为数组大小的所有潜在排列分配大小,从而导致了非常大的类型。由于这是一种受限类型,因此我不确定它是否仍然必须这样做(因此可能是一个错误)。

您可以通过将声明的discriminant更改为特定的constraint来解决此问题:

-- create an array of queues
Queue_Array : array(ID_Type) of ID_Holder_Queue.Queue
    (Capacity => 16,
     Ceiling  => System.Priority'Last);

并附带系统;

那应该消除您的存储错误。如果您使用的是GNAT编译器,则This可能与此有关。