定义多维数组的多个元素

hal*_*exh 1 ada

在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)

但似乎都不是正确的语法.有办法做到这一点吗?

谢谢

ajb*_*ajb 5

语法

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)