Ada中不同类型之间的数组切片

时间:2014-04-18 14:50:34

标签: arrays ada

An Ada tutorial I'm reading说这在Ada中是有效的事情:

Large : array (0 .. 100) of Integer;
Small : array (0 .. 3) of Integer;

-- extract section from one array into another.
Small(0 .. 3) := Large(10 .. 13);

However, when I actually try it,它不起作用。

为了简单起见,我正在使用ideone的在线Ada环境来玩这些东西(上面的链接)。教程是错误的,还是指的是一个没有实现的Ada版本?

1 个答案:

答案 0 :(得分:6)

教程错了。

这将编译,但是:

type Integer_Array is array (Natural range <>) of Integer;
Large : Integer_Array (0 .. 100);
Small : Integer_Array (0 .. 3);

...
Small (0 .. 3) := Large (10 .. 13);

详细信息:在我的示例中,Integer_Array类型(实际上是类型和&#34;第一个子类型&#34;),Integer_Array(0..100)和{ {1}}受约束子类型。 Ada中的数组类型指定索引的类型和元素的类型,但不指定边界;边界由子类型指定,特别是受约束的子类型。 (这并不意味着您需要Integer_Array(0..3)声明; subtype声明可以导致定义类型和约束子类型。)

Ada分配(通常)要求源和目标属于同一类型,但它们可以是不同的子类型。因此,在我的示例中,源和目标都是type的子类型,因此赋值符合此要求。

在原始示例中,Integer_ArrayLarge的声明定义了新的匿名数组类型。每种类型都是无界的,声明也定义了用作变量的有界子类型。亚型。但重要的是,定义了两种不同的类型,并且您不能将一种类型分配给另一种类型。此外,由于类型未命名,因此您无法使用类型转换来进行分配,就像在这样的示例中一样:

Small

此处,type Integer_Array is array (Natural range <>) of Integer; Large : array (0 .. 100) of Integer; Small : Integer_Array (0 .. 3); ... Small (0 .. 3) := Integer_Array (Large (10 .. 13)); Large又有两种不同的类型,但可以进行类型转换,因为目标类型已命名。

这里的道德是使用命名数组类型更好。变量声明,如

Small
在某些情况下,

足够好;但正如这个例子所示,你可以做些些事情。