在Ada中,当你声明一个数组时,你可以做类似的事情
Work_Day : constant array (Day) of Boolean := (Mon .. Fri => True, Sat | Sun => False);
Run Code Online (Sandbox Code Playgroud)
利用..和| 符号来说明数组的多个元素,而不必引用每个数组.
我想做类似的事情,但是有一个数组的数组,我不想在声明中这样做,而是在程序的后面,当我可能需要重新定义初始值时.我正在尝试做类似的事情
-- Set elements 2 through 5 of row 1 to asdf
Array_of_Arrays(1)(2..5) := "asdf";
Run Code Online (Sandbox Code Playgroud)
要么
-- Set elements 1 and 3 of row 1 to asdf2
Array_of_Arrays(1)(1 | 3) := "asdf2"
Run Code Online (Sandbox Code Playgroud)
但似乎都不是正确的语法.有办法做到这一点吗?
谢谢
语法
Array_of_Arrays(1)(2..5) := "asdf";
Run Code Online (Sandbox Code Playgroud)
是合法的,假设你有什么是真正的数组的数组.但是,我猜你没有.与某些语言(C,Java等)不同,Ada对多维数组和"数组数组"进行了区分.一个二维数组被声明为
type Array_Type is array (1 .. 10, 1 .. 5) of Character;
Array_2D : Array_Type;
Run Code Online (Sandbox Code Playgroud)
(类似于3维或更高维数组).当您声明这样的数组类型时,使用以逗号分隔的索引来引用单个元素:
Array_2D (2, 3) := 'x';
Run Code Online (Sandbox Code Playgroud)
并不是
Array_2D (2) (3) := 'x'; -- wrong!! will not compile
Run Code Online (Sandbox Code Playgroud)
您不能将切片用于多维数组:
Array_2D (1, 2..5) := "asdf";
Run Code Online (Sandbox Code Playgroud)
语言设计者不允许这样做.
数组数组将被声明为:
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;
Run Code Online (Sandbox Code Playgroud)
现在,由于数组行类型是分开的,因此不使用多维数组语法.要获得一个角色,你会使用类似的东西
Array_Of_Arrays (2) (3) := 'x';
Run Code Online (Sandbox Code Playgroud)
做一些类似的事情是合法的
Array_Of_Arrays (1) (2..5) := "asdf";
Run Code Online (Sandbox Code Playgroud)
但不是
Array_Of_Arrays (1, 2..5) := "asdf"; -- syntax error
Run Code Online (Sandbox Code Playgroud)
关键是要记住,在这种情况下,数组的每个"行"都是一个单独的数组对象,具有自己的数组类型; 而在多维情况下,行没有自己的类型.
你可以使用任何一个; 在某些情况下,数组数组可能更合适,有些情况下多维数组更合适.
由于String是一种数组类型,因此它也是一个数组数组:
type Array_Of_Strings is array (1 .. 10) of String(1..5);
Run Code Online (Sandbox Code Playgroud)
这是合法的:
A : Array_Of_Strings;
A (3) (4) := 'y';
Run Code Online (Sandbox Code Playgroud)
但不是
A (3, 4) := 'y'; -- illegal
Run Code Online (Sandbox Code Playgroud)