2017-03-16 44 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