1

John Barnesの Programming in Ada 2012を読んでいます。セクション 8.6 で、彼は配列の連結と配列境界のルールについて説明しています。特に:

結果の下限は、基になる配列が制約されているかどうかによって異なります。制約がない場合...下限は左オペランドの下限です...[そうでない場合]下限は配列インデックスサブタイプの下限です。

次に、8.6 の演習では、質問 7 は次のとおりです ([] 内に Web サイトの PDF にある回答を追加しました)。

  1. 与えられた

    タイプ TC は整数の配列 (1..10) です。
    タイプ TU は整数の配列 (自然範囲 <>) です。
    AC: TC;
    AU: TU(1..10);

次の境界は何ですか:

(a) AC(6..10) & AC(1..5)           [1..10]        
(b) AC(6) & AC(7..10) & AC(1..5)   [1..10]   
(c) AU(6..10)& AU(1..5)            [6..15]  
(d) AU(6) & AU(7..10) & AU(1..5)   [0..9]     

AC配列は制約付きの型に基づいているため、インデックスの境界を使用するだけなので、aとbへの答えは私には理にかなっています。基になる型が制約されていないため、左端のオペランド AU(6) または AU(6..10) が開始境界を決定するため、c に対する答えは両方とも 6..15 である必要があります。次に、理解を深めるために以下に示すようにコーディングしてみました。4 つすべてが境界を 1..10 として示しています。私のコードが間違っていますか、答えが間違っていますか、それともテキストの説明が間違っていますか? (ところで、私も新しい配列変数でコーディングし、それらに割り当てを行いましたが、結果は同じです)。

type TC is array (1..10) of Integer;
type TU is array (Natural range <>) of Integer;
AC: TC;
AU: TU(1..10);

begin
  AC := AC(6..10) & AC(1..5); 
  Tio.Put("7a) Constrained type starting with 6..10  ");
  Iio.Put(AC'First); Iio.Put(AC'Last); Tio.New_Line;

  Tio.Put ("7b) Constrained type starting with 6      ");
  AC := AC(6) & AC(7..10) & AC(1..5); -- 7.b
  Iio.Put(AC'First); Iio.Put(AC'Last); Tio.New_Line;

  Tio.Put ("7c) Unconstrained type starting with 6..10");
  AU := AU(6..10) & AU(1..5);
  Iio.Put(AU'First); Iio.Put(AU'Last); Tio.New_Line;
  Tio.Put_Line("Answer keys says 6..15");

  Tio.Put ("7d) Unconstrained type starting with 6    ");
  AU := AU(6) & AU(7..10)& AU(1..5);
  Iio.Put(AU'First); Iio.Put(AU'Last); Tio.New_Line;
  Tio.Put_Line("Answer key says 0..9 - Why not 6..15???");

(Tio と Iio は、テキストと整数の std Ada io パッケージの名前を変更しただけです)

このコードを実行すると、次のコンソール出力が生成されます。

E:\Google Drive\SW_DEV\Ada\Sample\obj\hello
7a) Constrained type starting with 6..10            1         10
7b) Constrained type starting with 6                1         10
7c) Unconstrained type starting with 6..10          1         10
Answer keys says 6..15
7d) Unconstrained type starting with 6              1         10
Answer key says 0..9 - Why not 6..15???
4

1 に答える 1

4

AU は、下限 1 (範囲 1..10 の無名配列サブタイプ) で始まるように定義されています。それは決して変わることはありません。

制約のない結果 (c および d) については、次のように新しい変数に割り当てる必要があります。

declare
   AU_c : TU := AU(6..10) & AU(1..5);
   AU_d : TU := AU(6) & AU(7..10)& AU(1..5);
begin
   -- your Put/Put_Lines here
end;
于 2015-03-09T21:54:25.257 に答える