Определение нескольких элементов многомерного массива

В Аде, когда вы объявляете массив, вы можете сделать что-то вроде

    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";

or

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

Но ни один из них не кажется правильным синтаксисом. Есть ли способ сделать это?

Спасибо


ada
person halexh    schedule 09.07.2013    source источник


Ответы (1)


Синтаксис

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

допустимо, если предположить, что у вас есть действительно массив массивов. Тем не менее, я предполагаю, что вы этого не сделаете. В отличие от некоторых языков (C, Java и т. д.), Ада делает различие между многомерными массивами и «массивами массивов». Двумерный массив объявляется примерно так

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

(и аналогично для трехмерных и многомерных массивов). Когда вы объявляете свой тип массива таким образом, вы используете индексы, разделенные запятыми, для ссылки на один элемент:

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
person ajb    schedule 09.07.2013
comment
Я действительно сделал массив массивов, как вы заявили. Мой 'Array_Row' объявлен как тип String, а не символ. Может поэтому он до сих пор не компилируется? - person halexh; 09.07.2013
comment
Не могли бы вы опубликовать полный код (все соответствующие объявления и точное выражение, вызвавшее ошибку) и сообщение об ошибке, которое выдал вам компилятор? - person ajb; 09.07.2013