2013-07-09 3 views
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

Синтаксис

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 

Ключ должен помнить, что в этом case, каждая «строка» массива представляет собой отдельный объект массива со своим собственным типом массива; в то время как в многомерном случае строки не имеют собственных типов.

Вы можете использовать любой из них: есть случаи, когда массив массивов может быть более уместным, а некоторые, где многомерный массив более уместен.

Поскольку строка является типом массива, это также является массивом массивов:

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 
+0

я на самом деле сделать массив массивов, как вы заявили. Мой «Array_Row» объявлен как тип String, хотя вместо символа. Неужели это и не скомпилируется? – halexh

+0

Не могли бы вы выслать полный код (все соответствующие объявления и точный оператор, который получил ошибку), и сообщение об ошибке, которое дал вам компилятор? – ajb

Смежные вопросы