Ада - Массив очередей непринужденных объектов приводит к Storage_Error - Как решить? - PullRequest
0 голосов
/ 01 марта 2019

Итак, отказ от ответственности, я использую Ada только несколько недель ... Я ожидаю, что это приведет к ошибке noob, вызывающей это.

Итак, (анонимный) код у меня есть ...

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 явное повышение

Использование по назначению для интерфейсас драйверами уровня С, извлекающими данные из последовательного порта.(Отсюда unchecked_union и другие предложения представления)

Попытался обернуть с помощью Indefinite_Holder, предполагая, что неопределенная проблема была из типа Unconstrained ... и получал ту же ошибку.Думал, что мне это не понадобится, потому что, хотя это неограниченный вариант, он имеет определенные размеры.В любом случае, то же самое.

Также стоит отметить, что: test1: array (ID_Type) Data_Type;- работает test2: Data_Queue.Queue;- работает test3: массив (1 .. 2) Data_Queue.Queue;- Storage_Error

Что я делаю не так?

1 Ответ

0 голосов
/ 04 марта 2019

Определение 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 пытается выделить размер для всех возможных перестановок размеров массива, что приводит к типу чрезвычайно большого размера.Поскольку это ограниченный тип, я не уверен, что он все еще должен это делать или нет (поэтому может быть ошибка).

Вы можете исправить это, изменив объявление дискриминанта иметь определенное ограничение :

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

и без System;

Это должно устранить вашу ошибку хранения. Это может быть связано, если вы используете компилятор GNAT.

...