1

Adaで2D配列で属性を使用しようとしてい'Lastますが、正しい構文が見つからないようです。

1D配列/ベクトルがある場合は、A'lastまたはA'last(n)を使用できることを知っています。ここで、nはn番目の次元です。しかし、私が次のことをすると

type UnconstrainedArray_2D is array (Integer range <>, Integer range <>) of Integer;

function temp(tempIn : in Integer;
              Table  : in UnconstrainedArray_2D) return Integer is
tempTable : UnconstrainedArray_2D(0..tempIn, 0..tempIn);

begin
    for i in 0..tempTable'last(1) loop
        for j in 0..tempTable'last(2) loop
            tempTable(i, j) := Table(i,j);
        end loop;
    end loop;
end temp;

次のコンパイル時エラーが発生します。

Storage_Errorスタックオーバーフロー(または誤ったメモリアクセス)

だから私は何が間違っているのですか?

LinuxでGNATPro6.4.1を使用しています。

4

3 に答える 3

3

そのコードのコンパイル時間 があるとしたら、私は非常に驚かれることでしょう。Storage_Error

あなたのコードのコピーを入手し、次のように修正しました。GNAT (gcc-4.4) を使用してエラーなしでコンパイルします。

procedure Array_2D is
    type UnconstrainedArray_2D is array (Integer range <>, Integer range <>) of Integer;

    function temp(tempIn : in Integer;
                  Table  : in UnconstrainedArray_2D) return Integer is
    tempTable : UnconstrainedArray_2D(0..tempIn, 0..tempIn);

    begin
        for i in 0..tempTable'last(1) loop
            for j in 0..tempTable'last(2) loop
                tempTable(i, j) := Table(i,j);
            end loop;
        end loop;
        return 42; -- added this
    end temp;
begin
    null;
end Array_2D;

(欠落しているreturnステートメントを に追加しなければならなかったことに注意してくださいtemp。)

属性 (「コマンド」ではない)の構文'Lastは正しいですが、Ada 配列には任意の下限と上限を設定できるため、'Range代わりに属性を使用することをお勧めします。

    for i in tempTable'Range(1) loop
        for j in tempTable'Range(2) loop
            tempTable(i, j) := Table(i,j);
        end loop;
    end loop;

例外については、 に非常に大きな値を指定して関数を呼び出すと、(コンパイル時ではなくStorage_Error)実行時に簡単に発生する可能性があります。オブジェクトを保持するのに十分なスペースを割り当てる必要があることに注意してください。おそらく、パラメーターとして渡される別のオブジェクトも作成しているはずです。temptempIntempIn**2 IntegerUnconstrainedArray_2DTable

コンパイラ自体がStorage_Error例外で終了する可能性があると考えられますが、それを引き起こす可能性のあるコードには何も表示されません。

発生している問題を示す完全な (ただし小さい) プログラムと、正確な (コピーして貼り付けた) エラー メッセージを提示してください。コンパイル時エラーと実行時エラーを明確に区別してください。

于 2012-04-04T21:44:26.783 に答える
2

あなたtempTableの範囲0..tempInTable.

長さが同じであることを確認してから、次のように相対インデックスを使用する必要があります。

function temp(tempIn : in Integer;
              Table  : in UnconstrainedArray_2D) return Integer is
    tempTable : UnconstrainedArray_2D(0..tempIn, 0..tempIn);

begin
    if tempTable'Length (1) /= Table'Length (1) or else
      tempTable'Length (2) /= Table'Length (2)
    then
       raise Constraint_Error; -- or something else
    end if;
    for i in 0 .. tempTable'Length (1) - 1 loop
        for j in 0 .. tempTable'Length (2) - 1 loop
            tempTable(tempTable'First (1) + i, tempTable'First (2) + j) :=
              Table(Table'First (1) + i, Table'First (2) + j);
        end loop;
    end loop;
end temp;

そうすれば、両方のテーブルが同じ長さであり、すべてのインデックスが有効であることが保証されます。

tempTableを より小さくしてもよい場合は、Table単に長さチェックを に調整し>ます。インデックスは引き続き有効です。

于 2012-04-05T06:33:44.550 に答える
0

tempInセットの実際の値が表示されません。関数 temp に渡されるte​​mpInの値が適切に初期化されていないか、明示的に設定されていない場合、tempInの値は何でもかまいません。


デフォルト値を考えていました。(体調が悪いときは投稿しないほうがいいかもしれません:-)

于 2012-04-06T14:17:26.520 に答える