2013-07-09 92 views
1

在阿達,在聲明數組,你可以這樣做定義多維數組

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 

的關鍵是要記住,在這個情況下,數組中的每個「行」都是一個單獨的數組對象,它擁有自己的數組類型;而在多維情況下,行沒有它們自己的類型。

您可以使用任一個;有些情況下數組數組可能更合適,有些情況下多維數組更適合。

由於字符串是一個數組類型,這也是一個數組的數組:

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