Здесь немного расширяется Shark8 ...
Ada позволяет вам объявлять типы массивов как неограниченные.Что-то вроде
type Array_of_Records is array (Natural range <>) of My_Record;
Дает вам тип, который можно использовать для массивов записей с индексами начального и конечного массивов, которые могут находиться где угодно в диапазоне Natural
.
. Один изИзящные вещи, которые я могу сделать с таким типом, это использовать его в качестве параметра подпрограммы, например:
function Sum (Vector : in Array_of_Records) return Natural;
ОК, так что внутри этой подпрограммы, как узнать, где находятся границы массива?Используя атрибуты, например, так:
for index in Vector'first..Vector'last loop
или
for index in Vector'range loop
Конечно, чтобы это работало, вы должны передать массив идеального размера в вашу подпрограмму Sum.Предположим, это не то, что у вас есть.Предположим, у вас есть огромный массив (вид буфера), и не все значения допустимы?Ну, вы отслеживаете, какие допустимые значения, и передаете только эти , используя slice .
Rec_Buffer : Array_of_Records (1..10_000);
Last_Valid_Rec : Natural := 0;
....
--// Rec_Buffer gets loaded with 2,128 values or something. We pass it into Sum
--// like so:
Ada.Text_IO ("Sum of vector is " &
natural'image(Sum (Rec_Buffer (1..Last_Valid_Rec));
(предупреждение - не скомпилированный код)