Расширение на Ответ Кита : Вы хотите получить результат переменной длины, поэтому более ада-подобный способ - использовать «неограниченный массив»:
type Vector is array (Positive range <>) of Integer;
Это означает, что Вы можете создавать экземпляры массива любого размера, который вам нравится, при условии, что границы положительные: 1 .. 100, 42 .. 43 и c. Вы даже можете создать массив нулевой длины, указав, что последняя граница (называемая ’Last
) будет меньше первой (называемой ’First
). В этом особом случае вам разрешается использовать ’Last
вне диапазона типа индекса (в данном случае 0 или даже -42, если вы хотите запутать людей!).
function mkarr return Vector is
У нас должен быть фактический массив для накопления значений, поэтому установите верхний предел 100.
Result : Vector (1 .. 100);
Нам нужно знать, сколько элементов существует.
Last : Natural := Result'First - 1;
Подробнее или меньше, чем раньше,
K : Integer;
begin
Ada.Text_IO.Put
("enter numbers to fill array, negative or 0 will stop process: ");
for I in Result'Range loop
Мы можем вернуть массив максимум с Result’Length
элементами.
Ada.Integer_Text_IO.Get (K);
if K > 0 then
Мы можем добавить еще один элемент.
Last := Last + 1;
Result (Last) := K;
else
Менее 100 элементов, поэтому верните только этот фрагмент.
return Result (Result'First .. Last);
end if;
end loop;
Мы собрали 100 результатов, поэтому вернем все из них.
return Result;
end mkarr;