4

私は大学のコースでエイダを学ぼうとしていますが、その中のいくつかのアイデアに頭を悩ませることに多くの問題があります。

私の現在のつまずき:マトリックス(整数の2次元配列のみ)を受け取り、新しい、より小さなマトリックス(最初の行と最初の列を取り除く)を返す関数があるとしましょう。

マトリックスと関数を次のように宣言します。

type MATRIX is array(INTEGER range <>, INTEGER range <>) of INTEGER;
function RemoveFirstRowCol (InMatrix: in MATRIX) return MATRIX is

次に、返すマトリックスのサイズを決定します。

     Result_matrix: MATRIX (InMatrix'First(1) .. InMatrix'Length(1) - 1, InMatrix'First(2) .. InMatrix'Length(2) - 1);

次に、計算を行い、Result_matrixを返します。

これが私の問題です。これを実行すると、この関数の結果を正確な適切なサイズで宣言されたMatrix以外のものに戻そうとすると、実行時に例外が発生することがわかりました。

私の質問は、私はこれを正しく行っているのかということです。サイズの観点から関数が何を返すかを事前に知る必要はないように思えます。宣言されたマトリックスが私が返すものよりも大きい場合でも、エラーが発生します。繰り返しになりますが、Adaの全体的な考え方は強い型付けであるため、おそらくこれは理にかなっています(戻り型を正確に知る必要があります)。

とにかく、私はこれを正しく行っていますか?返された行列のサイズを事前に知らずにこの関数を使用する方法は本当にありませんか?

ありがとう、エダン

4

4 に答える 4

1

MATRIXタイプはバインドされていないインデックスで宣言されているため、タイプは不完全です。これは、関数によって返される可能性があることを意味します。この場合、これはポインタとして機能します。もちろん、コンパイラはコンパイル時に正確なインデックスを認識していません。結果の行列は常にヒープに割り当てられます。

ソリューションが機能しているはずです。唯一の問題は、結果マトリックスを作成するときに、元のマトリックスインデックスが0で始まる場合にのみ機能することです。

m:MATRIX(11..15,11..20);

この場合、m'first(1)は11、m'length(1)は5です。だからあなたは得る:

Result_matrix:MATRIX(11..4,11..9);

これはCONSTRAINT_ERRORです。

代わりに最後の属性を使用してください。通常0インデックスで使用する場合でも。

ただし、MATRIXも不完全であるため、MATRIXへのポインターを使用する必要はありません。そのため、関数によって返されるように使用できます。

于 2010-01-20T12:57:26.957 に答える
0

あなたの関数は、新しい行列へのポインタを返す必要があるコンパイル時に結果行列のサイズを知ることができません:

type Matrix is array (Positive range <>, Positive range <>) of Integer; 
type Matrix_Ptr is access Matrix; 

       -- chop the 1'th row and column
       function Chopmatrix (
             Inputmatrix : in     Matrix ) 
         return Matrix_Ptr is 
          Returnmatrixptr : Matrix_Ptr;  

       begin

          -- create a new matrix with is one row and column smaller
          Returnmatrixptr  := new Matrix(2 .. Inputmatrix'Last, 2..  Inputmatrix'Last(2) );
          for Row in Inputmatrix'First+1 .. Inputmatrix'Last loop
             for Col in Inputmatrix'First+1 .. Inputmatrix'Last(2) loop
                Returnmatrixptr.All(Row,Col) :=   Inputmatrix(Row,Col);
             end loop;

          end loop;
          return Returnmatrixptr;
       end Chopmatrix ;
于 2009-11-13T21:42:50.293 に答える
0

呼び出し元は、関数に渡す行列の次元を知っているため、呼び出し元は、関数の戻り値を格納する変数の型をそれらの次元で定義できます。それは本当にうまくいきませんか?

于 2009-11-13T21:36:36.883 に答える