使用范围作为索引的数组索引的类型是什么?

Mar*_*kus 1 ada

给定以下数组定义:

type A is array (1 .. 10) of INTEGER;
Run Code Online (Sandbox Code Playgroud)

以下通用:

generic
   type LENGTH_T is range <>;
   type INDEX_T is (<>);
   type ELEMENT_T is limited private;
   type ARRAY_T is array (INDEX_T) of ELEMENT_T;
function LIST_IMAGE
  (LENGTH : in LENGTH_T;
   ITEMS  : in ARRAY_T)
   return STRING;
Run Code Online (Sandbox Code Playgroud)

有没有一种方法来实例化LIST_IMAGEA?我需要为索引的类型添加什么?

function ARRAY_IMAGE is new LIST_IMAGE
  (LENGTH_T  => NATURAL,
   INDEX_T   => ???,
   ELEMENT_T => INTEGER,
   ARRAY_T   => A);
Run Code Online (Sandbox Code Playgroud)

Jac*_*sen 6

解决方案是匿名整数范围始终成为Integer子类型:

with Ada.Text_IO;

procedure Range_Of_Universal_Integer is

   type A is array (1 .. 10) of Integer;

   generic
      type Length_T is range <>;
      type Index_T is (<>);
      type Element_T is limited private;
      type Array_T is array (Index_T) of Element_T;
   function List_Image (Length : in Length_T;
                        Items  : in Array_T) return String;

   function List_Image (Length : in Length_T;
                        Items  : in Array_T) return String is
      pragma Unreferenced (Length, Items);
   begin
      return "Hello";
   end List_Image;

   subtype A_Lengths is Integer range 0 .. A'Length;
   subtype A_Range   is Integer range A'Range;

   function Image is
     new List_Image (Length_T  => A_Lengths,
                     Index_T   => A_Range,
                     Element_T => Integer,
                     Array_T   => A);

begin
   Ada.Text_IO.Put_Line (Image (Length => 0,
                                Items  => A'(others => 0)));
end Range_Of_Universal_Integer;
Run Code Online (Sandbox Code Playgroud)