在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"
但似乎两者都不是正确的语法。有没有办法做到这一点?
由于
答案 0 :(得分: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