为什么array' First在这个例子中总是1?

时间:2018-05-08 21:12:45

标签: ada

我有一组节点:

  type NodeArray is array (Positive range 1 .. 5) of XNode;

该节点有一些数据和一个整数ID,但现在这并不重要。

我不记得的方式是array'First(借口滥用符号)总是指向或引用范围或数组中的第一项,而不是范围类型的整数。

我的问题是为什么我总是得到1而不是我的数组中的第一个条目。

如果您需要查看我可以提供的更多代码,我只是认为我的示例简单而简短。

1 个答案:

答案 0 :(得分:5)

你的

type NodeArray is array (Positive range 1 .. 5) of XNode;

定义约束数组类型(ALRM 3.6(5)),其第一个索引始终为1。

如果要使用一种类型来创建具有不同索引范围的数组对象,则需要一个带有Positive range <>边界的无约束数组类型(ALRM 3.6(3))(注意1,一旦创建了这样的类型)一个对象,它的边界是固定的;注意2,而不是Positive,你可以使用任何适合问题的标量。)

with Ada.Text_IO; use Ada.Text_IO;

procedure Zython is

   type Unconstrained_Node_Array is array (Positive range <>) of Float;

   subtype Constrained_Node_Array is Unconstrained_Node_Array (1 .. 5);

   U : Unconstrained_Node_Array (42 .. 44); -- must include the index range

   C : Constrained_Node_Array;              -- the index range is 1 .. 5

begin
   for J in U'Range loop
      U (J) := Float (J) * 2.0;
   end loop;

   Put_Line ("U'First: "
               & Positive'Image (U'First)
               & ", U (U'First): "
               & Float'Image (U (U'First)));

   for J in C'Range loop
      C (J) := Float (J) * 2.0;
   end loop;

   Put_Line ("C'First: "
               & Positive'Image (C'First)
               & ", C (C'First): "
               & Float'Image (C (C'First)));
end Zython;