2017-03-16 10 views
0

私はこのようなADAにおけるマトリクス型定義:入力行列にいくつかの変換を適用するためにADA無効インデックス制約

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

を、Iは、関数の行列スライスを定義する必要があります。 A'Lengthを置くことはA'Length /2がするように番号を返すために、invalid index constraint私はかなり理解していない:

は私が

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; 

しかし、それを次のように実行して、コンパイルがエラーで失敗することを試みました。そのような固定番号を使ってCを宣言すれば、

C: Matrix_Type(2,2); 

すべてがうまくいきます。

この場合のエラーは、関数に初期化されていない行列を渡しても、それは私には分かりません。

+1

あなたは 'Cと言います:Matrix(2、2); 'うまく動作しますが、ここにはありません!まったく同じエラー。 –

答えて

6

行列Cためindex constraintrange次のようになります。

非正方行列の場合
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

関連する問題