代码之家  ›  专栏  ›  技术社区  ›  Markus

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

ada
  •  1
  • Markus  · 技术社区  · 8 年前

    给定以下数组定义:

    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;
    

    有没有办法举例说明 LIST_IMAGE 对于 A ?对于索引类型,我需要放置什么?

    function ARRAY_IMAGE is new LIST_IMAGE
      (LENGTH_T  => NATURAL,
       INDEX_T   => ???,
       ELEMENT_T => INTEGER,
       ARRAY_T   => A);
    
    3 回复  |  直到 8 年前
        1
  •  6
  •   Jacob Sparre Andersen    8 年前

    解决方案是,匿名整数范围始终成为 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;
    
        2
  •  1
  •   Jere    8 年前

    雅各布已经给出了一个完整的答案,但他想添加一个可选的子类型声明:

    type A is array (1 .. 10) of Integer;
    
    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);
    
        3
  •  0
  •   Jim Rogers    8 年前

    通过为数组索引创建命名子类型来简化问题。

    subtype Index_Type is Integer range 1..10;
    type A is array(Index_Type) of Integer;
    
    function Array_Image is new List_Image 
      ( Length_T  => Natural,
        Index_T   => Index_Type,
        Element_T => Integer,
        Array_T   => A);