Ada数组的设置

2018-10-27 10:06 更新

访问和设置数组(Access and Set Arrays)

访问数组时,只需在添加在 index specification 范围内的下标,如 3.2 中的数组Unit1:

Unit1 (1) := 190; -- 赋予Unit(1)值 190;
Unit1 (7) := 210;
Unit1 (7) > Unit (1) -- 返回 True;

数组的值虽然可以单个元素分别赋予,但这样做明显是开玩笑的麻烦。以上例中的Var:Enrollment 为例,一般情况下可以如下赋值:

Var := (15,14,13);

结果为 Var (Bill) = 15, Var (Jack) = 14, Var (Tom) =13,( )中的值,按顺序赋给数组里的元素,因此数量也不能少:

Var := (15,14) -- 不合法

当数组元素有名称时,例如元素下标是用枚举类型表示,也可以这样赋值:

Var := (Bill => 15, Jack => 14, Tom => 13);

结果与上等同。但如果同时用以上两种表示法是不合法的,如:

Var := (Bill => 15, Jack => 14, 13); -- 不合法

如希望相邻的一些元素都是相同值,如 Var (Bill)、 Var(Jack)、Var(Tom)都等于 15,则可以如下:

Var := (Bill .. Tom => 15);

注意是 Bill 和 Tom (包括它们本身)之间的所有元素值为 15。

而希望 Var (Bill) 等于 15,其余都等于14时,也可以如下:

Var := (Bill => 15, others => 14);

这样 Var (Jack) = Var(Tom) =14。others 在有很多元素都要赋予相同值时是相当有用。

如果将 Var 作为常量数组,则在声明该数组时就赋予初使值:

Var :constant Enrollment := (Bill => 15, others => 14);

最后看一下以下三种情况:

type Vector is array (Integer range <>) of Float;
V: Vector(1 .. 5) := (3 .. 5 => 1.0, 6 | 7 => 2.0);-- [1]
V := (3 .. 5 => 1.0, others => 2.0); -- [2]
V := (1.0, 1.0, 1.0, others => 2.0); -- [3]

对于 [3],我们已经学过:V(1)=V(2)=V(3)=1.0,V(4)=V(5)=2.0。 但 [1] 和 [2] 却很特殊,在 [1] 中:V(1)=V(2)=V(3)=1.0,V(4)=V(5)=2.0;在[2]中V(3)=V(4)=V(5)=1.0,V(1)=V(2)=2.0。[1]和[2] 的情况是 Ada95 新增的。像 [1] 的话,Ada83 会认为它是超过了数组的下标,产生异常 Constraint_Error,而在 Ada95 则是合法的,并且( )里面的值按顺序赋给数组的元素;[2] 在 Ada83 里也是不允许的,Ada95 允许先赋值给V(3),V(4),V(5),others 就默认是指 V(1) 和 V(2)。这3种情况很容易引起混淆,请读者注意一下。

数组

数组运算符(Array Operations)

赋值

整个数组的值可以赋给另一个数组,但这两个数组需要是同1种数组类型,如果是无约束数组,数组的元素的个数要相等。如:

My_Name : String (1..10) := "Dale ";
Your_Name : String (1..10) := "Russell ";
Her_Name : String (21..30) := "Liz ";
His_Name : String (1..5) := "Tim ";
Your_Name := My_Name;
Your_Name := Her_Name; -- 合法的,它们的元素个数和类型相同
His_name := Your_name; -- 会产生错误,类型虽然相同,但长度不同

等式与不等式

数组也可以使用运算符 = ,/=,<=,>=,<,> ,但意义与单个元素使用这些运算符不一样。如:

Your_Name = His_Name --返回值为 False

=,/= 比较两个数组中每个元素的值。如果两个数组相对应的元素值---包括数组长度都相等,则这两个数组相等,否则不相等。

Your_Name < His_Name --返回值为 True

<=,>=,>,< 实际上比较数组中第一个值的大小,再返回True或Fasle,数组长度不一样也可比较。

连接符

连接符为 & ,表示将两个数组类型相“串联”。如:

His_Name & Your_Name --返回字符串 "Tim Russell"

type vector is array(positive range <>) of integer;

a : vector (1..10);

b : vector (1..5) := (1,2,3,4,5);

c : vector (1..5) := (6,7,8,9,10);

a := b & c;

则 a =( 1,2,3,4,5,6,7,8,9,10);如果再添一句:

a := a (6..10) & a(1..5);

则 a =(6,7,8,9,10,1,2,3,4,5)。这种情况也有点特殊,虽然 a(1..5) 看上去接在 a(10) 后面,实际上 a(6..10)和a(1..5)连接重新组合成一个10个元素的数组,再赋该值给 a。这种用法在 Ada83 里是认为不合法的,因为它认为 a(1..5) 是接在 a(10) 之后,而 a 只有10 个元素,不是 15 个。

数组属性(Array Attributes)

数组属性有以下一些,A 表示该数组:

A'First 返回 A 的下标范围的下限。

A'Last 返回 A 的下标范围的上限。

A'Range 返回 A 的下标范围,等价于 A'First .. A'Last。

A'Length 返回 A 中元素的数目。

下面的是为多维数组准备的:

A'First(N) 返回 A 中第 N 个下标范围的下限。

A'Last(N) 返回 A 中第 N 个下标范围的上限。

A'Range(N) 返回 A 中第 N 个下标范围,等价于 A'First(N) .. A'Last(N)。

A'Length(N) 返回 A 中第 N 个下标范围所包含元素的数目。

如:

Rectange : Matrix (1..20,1..30);
Length : array (1..10) of Integer;

因此:

Rectange'First (1) = 1; Rectange'Last (1) = 20;
Rectange'First (2) = 1; Rectange'Last (1) = 30;
Rectange'Length (1) = 20; Rectange'Length (2) = 30;
Rectange'Range(1) =1.. 20; Rectange'Range (2) = 1..30;
Length'First = 1; Length'Last = 10;
Length'Range = 1..10; Length'Length = 10;


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号