2016-12-13 9 views
2

問題ステートメントエイダ:1行1列

とReal_Matrixにアクセス最初の要素は、私は1行1列とReal_Matrixを有します。行1、列1の単一要素の値を評価したいと思います。 Matrix(I、J)構文を使用して行列にアクセスしようとするとエラーが発生します。以下を参照してください:

CODE

with Ada.Numerics.Real_Arrays; use Ada.Numerics.Real_Arrays; 
with Ada.Text_IO;    use Ada.Text_IO; 

procedure Matrix is 

    ------------------------------------ 
    -- Real_Matrix Division Operation -- 
    ------------------------------------ 

    function "/" (Left : Real_Matrix; 
       Right : Real_Matrix) return Real_Matrix 
    is 
    begin 
     return Left * Inverse(Right); 
    end "/"; 

    α : Real_Matrix := ((Integer'First => 1.0), 
         (Integer'First => 2.0)); 
    β : Real_Matrix := ((Integer'First => 3.0), 
         (Integer'First => 4.0)); 

begin 

    -- This operation returns an matrix with one row and one column -- 

    Put_Line(Float'Image(((Transpose(α) * α)/(Transpose(β) * β))(Integer'First, Integer'First))); -- Error: Missing "," -- 

end Matrix; 
+0

Real_Matrixの型定義を追加できますか? – NWS

+0

また、診断テクニックとして分解してください。行列演算結果を中間変数に代入する。それを別の操作として索引付けします。どの部分が失敗するかを確認します。 –

+0

'Integer'First'は' -2147483648'ですが、代わりに '1'や' 0'が必要なことに注意してください。 –

答えて

5

私はあなたが、これはコンパイラの障害や適切な動作ですが、コンパイラを強制した場合、あなたのコードをコンパイルするかどうかをあなたに伝えるために、実際の言語の弁護士が必要だと思います

Put_Line 
    (Float'Image 
    (Real_Matrix'((Transpose(α) * α)/(Transpose(β) * β)) 
     (Integer'First, Integer'First))); 

/操作は Real_Matrixを生成することを認識し、

私はこれを試してみましたが、Constraint_Errorがあります。私は、BrianDrummondの提案@

γ : constant Real_Matrix := (Transpose(α) * α)/(Transpose(β) * β); 

を試してみましたが、それは(これはMacOSのシエラのGNAT GPL 2016である)γ’First (2)が1であるのに対しγ’First (1)は、-2147483648であることが判明しました。

さらなる調査:これはGNATのInverseのバグだと確信しています。 ARM G.3.1(72)

この関数は、* Bが単位行列に(ほぼ)等しくなるように行列Bを返し言います。結果のインデックス範囲はA'Range(2)とA'Range(1)です。 Constraint_Errorは、A'Length(1)がA'Length(2)と等しくない場合に発生します。 Constraint_Errorは、行列Aの状態が悪い場合に発生します。

とGNATの実装はSolve(同じ符号は、(70))

この関数はAにY Xとなるように(ほぼ)等しい行列を返す言う

function Inverse (A : Real_Matrix) return Real_Matrix is 
    (Solve (A, Unit_Matrix (Length (A)))); 

あります* Y。これは、一連の線形方程式を解くための標準的な数学的演算です。結果のインデックス範囲はA'Range(2)とX'Range(2)です。 Constraint_Errorは、A'Length(1)、A'Length(2)、およびX'Length(1)が等しくない場合に発生します。 Constraint_Errorは、行列Aの状態が悪い場合に発生します。

Unit_Matrix(同じ参照、(79))

function Unit_Matrix (Order   : Positive; 
         First_1, First_2 : Integer := 1) return Real_Matrix; 

あるFirst_1First_2のデフォルト値に注目してください!

+0

例では、配列yの要素にアクセスするには、次の構文が使用されます。 Value_Of_Element_In_y:= y(y'First(1)、y'First(2) – evilspacepirate

+0

これは一例ではありません。リファレンスマニュアル。 –