在Ada中,我如何制作记录的子类型?

时间:2012-03-10 07:37:20

标签: record ada subtype

如果我有这样的记录类型:

  type ABC is record
       A : Integer;
       B : Integer;
  end record;

如何使用两个指定范围的整数类型创建ABC的子类型?

4 个答案:

答案 0 :(得分:3)

虽然本身没有回答你的问题(正如NWS所说,你不能这样做),如果不是A和B是整数,它们就是数组,你可以做以下事情:

package Record_Subtypes is

   type Int_Data is array (Integer range <>) of Integer;

   type ABC (X_Min, X_Max, Y_Min, Y_Max : Integer) is record
      A : Int_Data (X_Min .. X_Max);
      B : Int_Data (Y_Min .. Y_Max);
   end record;

   subtype ABC_4_4 is ABC(X_Min => 1, X_Max => 4,
                          Y_Min => 1, Y_Max => 4);

   subtype ABC_1_7_3_12 is ABC (X_Min => 1, X_Max => 7,
                                Y_Min => 3, Y_Max => 12);
end Record_Subtypes;

A和B记录字段然后利用记录判别式提供的索引子类型。

这是我不时使用的一个很好的技巧,当从接口(例如套接字)读取可变长度字符串时非常有用,其中要读取的字节数是通过固定大小的标头提供的;或者在具有枚举判别式的变体记录的情况下,我可以将记录子类型化为特定变体。

答案 1 :(得分:2)

您也可以使用泛型,如下所示:

generic
   type Number is range <>;
package Int_Record is
   type ABC is record
      A, B : Number;
   end record;
end Int_Record;

如果你想要A和B的不同范围,你必须使用两个通用参数。

用法如下:

procedure Foo is
   subtype My_Int is Integer range 1 .. 3;
   package My_Int_Record is new Int_Record (Number => My_Int);
   X : My_Int_Record.ABC;
begin
   X.A := 2; -- okay
   X.B := 4; -- error!
end Foo;

答案 2 :(得分:1)

Ada 2012我们现在有Dynamic_Predicate我们可以对其施加子类型限制,如下所示:

type ABC is record
    A : Integer;
    B : Integer;
  end record;

subtype XYZ is ABC
  with dynamic_predicate => 
  ((XYZ.A in Positive) and
   (XYZ.B not in Positive)) or else raise Constraint_Error;

答案 3 :(得分:0)

假设:

type ABC is record
   A : Integer;
   B : Integer;
end record;

您可以使用:

type XYZ is record
   A : Positive;  -- A is subtype of ABC.A
   B : Natural;   -- B is subtype of ABC.B
end record;

  function convert(Input: ABC) return XYZ is
  begin
     return Result : XYZ:= ( A => Input.A, B => Input.B );
  -- Put your exception handling here.
  end convert;