我正在阅读的Ada教程说,这是在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);
但是,当我实际尝试时,它不起作用。
为了简单起见,我正在使用ideone的在线Ada环境来玩这些东西(上面的链接)。本教程是否错误,或者是指ideone未实现的Ada版本?
本教程是错误的。
但这会编译:
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
是一个类型(实际上是一个类型和一个“第一子类型”),Integer_Array(0..100)
并且Integer_Array(0..3)
是受约束的子类型。Ada中的数组类型指定索引的类型和元素的类型,但不指定范围;边界由子类型(特别是受约束的子类型)指定。(这并不意味着您需要一个subtype
声明;type
声明可以导致定义类型和受约束的子类型。)
Ada分配(通常)要求源和目标是同一类型,但是它们可以是不同的子类型。因此,在我的示例中,源和目标都是的子类型Integer_Array
,因此分配满足此要求。
在原始示例中,声明Large
和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
再次有两种不同类型,但类型转换是可能的,因为目标类型而得名。
这里的道义是最好使用命名数组类型。像这样的变量声明
Large : array (0 .. 100) of Integer;
在某些情况下可能足够好;但是如本例所示,有些事情您无法使用它们完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句