1

在 Ada 中,当您声明一个数组时,您可以执行类似的操作

    Work_Day : constant array (Day) of Boolean := (Mon .. Fri => True, Sat | Sun => False);

它利用 .. 和 | 符号来解释数组的多个元素,而不必引用每个数组。

我想做类似的事情,但是使用数组数组,我不想在声明时这样做,而是在程序的后面,当我可能不得不重新定义初始值时。我正在尝试做类似的事情

   -- Set elements 2 through 5 of row 1 to asdf
   Array_of_Arrays(1)(2..5) := "asdf";

或者

   -- Set elements 1 and 3 of row 1 to asdf2
   Array_of_Arrays(1)(1 | 3) := "asdf2"

但两者似乎都不是正确的语法。有没有办法做到这一点?

谢谢

4

1 回答 1

5

语法

Array_of_Arrays(1)(2..5) := "asdf";

是合法的,假设你所拥有的实际上是一个数组数组。但是,我猜你不会。与某些语言(C、Java 等)不同,Ada 区分了多维数组和“数组的数组”。一个二维数组被声明为

type Array_Type is array (1 .. 10, 1 .. 5) of Character;
Array_2D : Array_Type; 

(对于 3 维或更高维数组也是如此)。当您像这样声明数组类型时,您使用以逗号分隔的索引来引用单个元素:

Array_2D (2, 3) := 'x';

并不是

Array_2D (2) (3) := 'x';  -- wrong!!  will not compile

您不能将切片用于多维数组:

Array_2D (1, 2..5) := "asdf";

语言设计者只是不允许这样做。

数组数组将被声明为:

type Array_Row is array (1 .. 5) of Character;
type Array_Of_Array_Type is array (1 .. 10) of Array_Row;
Array_Of_Arrays : Array_Of_Array_Type;

现在,由于数组行类型是独立的,因此您不必使用多维数组语法。要获得一个角色,你会使用类似的东西

Array_Of_Arrays (2) (3) := 'x';

做类似的事情是合法的

Array_Of_Arrays (1) (2..5) := "asdf";

但不是

Array_Of_Arrays (1, 2..5) := "asdf";  -- syntax error

关键是要记住,在这种情况下,数组的每一“行”都是一个单独的数组对象,具有自己的数组类型;而在多维情况下,行没有自己的类型。

您可以使用任何一种;在某些情况下,数组数组可能更合适,而在某些情况下,多维数组更合适。

由于 String 是一个数组类型,这也是一个数组数组:

type Array_Of_Strings is array (1 .. 10) of String(1..5);

这是合法的:

A : Array_Of_Strings;

A (3) (4) := 'y';

但不是

A (3, 4) := 'y';         -- illegal
于 2013-07-09T16:03:23.187 回答