Преобразовать тип в строку - PullRequest
3 голосов
/ 28 июня 2019

Я создал тип:

packages MyTypes.Type_A is
    subtype Counter_Type is Integer range 0 .. 15;
    type Array_Counter_Type is record
        Counter_01 : Counter_Type ;
        Counter_02 : Counter_Type ;
        Counter_03 : Counter_Type ;
        Counter_04 : Counter_Type ;
    end record;
end MyTypes.Type_A;

Я хочу отобразить свой массив следующим образом

MyArray : Array_Counter_Type;
print ( MyTypes.Type_A.Array_Counter_Type'Image (MyArray));

Но у меня ошибка:

префикс ogАтрибут «Изображение» должен быть скалярного типа

Как это сделать?И можно ли "настроить" Image для объединения 4-х счетчиков, разделенных '-'?

1 Ответ

5 голосов
/ 28 июня 2019

Это пока невозможно, но это будет в Аде 202x [ AI12-0020-1 ].До этого вам нужно будет определить подпрограмму (например, Image) и вызвать ее явно.См. Также этот связанный вопрос на SO.

Пример использования GNAT.Formatted_String:

main.adb

with Ada.Text_IO;
with GNAT.Formatted_String;

procedure Main is

   subtype Counter_Type is Integer range 0 .. 15;

   type Array_Counter_Type is
      record
         Counter_01 : Counter_Type;
         Counter_02 : Counter_Type;
         Counter_03 : Counter_Type;
         Counter_04 : Counter_Type;
      end record;

   -----------
   -- Image --
   -----------

   function Image (Array_Counter : Array_Counter_Type) return String is      
      use GNAT.Formatted_String;      
      Format : constant Formatted_String := +"%02d-%02d-%02d-%02d";
   begin      
      return
        -(Format
          & Array_Counter.Counter_01
          & Array_Counter.Counter_02
          & Array_Counter.Counter_03
          & Array_Counter.Counter_04);
   end Image;     

   AC : Array_Counter_Type := (0, 5, 10, 15);

begin
   Ada.Text_IO.Put_Line (Image (AC));
end Main;

Но вы также можете использовать Ada.Integer_Text_IO, Counter_Type'Image и т. Д., Если GNAT.Formatted_String недоступен.

...