2017-03-16 46 views
0

我在ADA定義的矩陣型是這樣的:阿達無效索引約束

type Matrix_Type is array(Natural range <>, Natural range <>) of Item_Type;

爲了一些轉換應用到輸入矩陣

,我需要一個函數來定義一個矩陣切片。

我想,通過這樣做以下方式

procedure Do_Stuff(M: Matrix_Type) is 
    -- c needs to be half as big as the input matrix M 
    C: Matrix_Type(A'Length/2, A'Length/2); 
begin 
    ... 
end Do_Stuff; 

但是,編譯失敗,出現錯誤:invalid index constraint我不太明白,既然把A'Length返回一個數字作爲A'Length /2一樣。如果我使用這樣的固定數字聲明C

C: Matrix_Type(2,2); 

一切工作正常。

這種情況下的錯誤是什麼,如果我將一些未初始化的矩陣傳遞給函數,我會理解它的唯一可能情況是,即使這對我來說也不合理。

+1

你說'C :矩陣(2,2);'工作正常,但它不在這裏!完全一樣的錯誤。 –

回答

6

index constraint爲矩陣C應該是一個range

procedure Do_Stuff(M: Matrix_Type) is 
    -- C needs to be half as big as the input matrix M 
    C : Matrix_Type(M'First .. M'Length/2, M'First .. M'Length/2); 
begin 
    … 
end Do_Stuff; 

對於非方陣,您可以使用Operations of Array Types指定特定指數:

C : Matrix_Type(M'First(1) .. M'Length(1)/2, M'First(2) .. M'Length(2)/2); 
+1

這裏需要小心M的下界!如果它不是0呢?或1? –

+1

還需要注意奇怪的'M'Length'。 – trashgod

+0

使用C:Matrix_Type(M'Range(1)/ 2和M'Range(2)/ 2)'會不會更好?在這種情況下,沒有預見到啓動索引的問題。 – NeoSer