Понимание границ объединенных массивов в Аде 2012

Я читаю Программирование в Аде 2012 Джоном Барнсом. В разделе 8.6 он обсуждает конкатенацию массивов и правила для границ массивов, в частности:

Нижняя граница результата зависит от того, ограничен ли базовый тип массива или нет. Если оно не ограничено... тогда нижняя граница - это левая операнд... [иначе] нижняя граница - это подтип индекса массива.

Затем в упражнениях для 8.6 вопрос 7 выглядит следующим образом (я добавил ответы, приведенные на веб-сайте PDF в []):

  1. Дано

    тип TC - массив (1..10) из Integer;
    тип 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]     

Ответы на a и b имели смысл для меня, так как массив AC основан на ограниченном типе, мы просто используем границы индекса. Я думаю, что ответы на c и оба должны быть 6..15, поскольку базовый тип не ограничен, крайний левый операнд AU(6) или AU(6..10) будет определять начальные границы. Затем я попытался написать код, как показано ниже, чтобы лучше понять, и все четыре показывают границы как 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???

1 ответ

Решение

Ваш 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;
Другие вопросы по тегам