Н. Джехани - Язык Ада (1988) (1160771), страница 7
Текст из файла (страница 7)
Например, присваивание Х(1..5)(2):=Х(1..5)(2) + 1.0; эквивалентно присваиванию Х(2) : = Х(2) + 1.0; Значения массива, называемые агрегапюм, конструируются непосредственно нз значений компонент. Агрегаты массива могут использоваться для присваивания значений объектам индексируемого типа нли в выражениях. Агрегаты массива можно образовать, используя позиционное сопоппавление, именное сопоставление или нх композицию. Агрегат должен быть полным, т. е.
значения должны задаваться всем компонентам составного значения. Тип агрегата, если он не задан явно, определяется из контекста. Тип агрегата может задаваться явно путем указания имени типа или подтнпа: Т'агрегагп где Т вЂ” это тип или подтип. Такая квалификация требуется в том случае, когда тип агрегата нельзя однозначно определить из контекста. Тип агрегата должен быть таким же, как и тип явно заданного типа или подтипа.
Ниже приведены примеры агрегатов и отрезков: (1, 2, 3, 4, 5) одномерный массив значений с пятью элементами; заданный с использоданием позиционного указания; значение 1-го элемента равно 1 (1..10 = > 5.5) одномерный массив значений с 10 элементами, каждый из которых имеет значение 5.5; при конструировании агрегата используется именное указание САЯР'(1 ( 45 = > "', о(пегз => ' ') одномерный массив значений типа САКР (тип агрегата указан явно), значения компонент 1 и 45 равны '*', а остальные компоненты имеют значения ' '. Диапазон индекса определяется из типа САКР. Вариант о!вега должен указываться последним. ('Т', 'е', 'з', З') одномерный массив символов "Тез1 " то же самое, что и в предыдущем примере; "..." — альтернативная форма записи одномерных агрегатов типа СНАКАСТЕК Вве нннв М:= (1..25 = > (1..25 = > 0.0)); в правой части присваивания указан двумерный массив агрегатных значений.
Он описывается как массив из 25 одномерных массивов, элементы которого равны 0.0. Здесь использовано именное указание Х(1..5):= (2 = > 5.0, 1 ! 3..5 = > 0.0); отрезку массива Х присваивается агрегат из 5. элементов; второй элемент агрегата равен 5.0, в то время как элементы 1, 3, 4 и 5 имеют значения 0.0 Границы позиционных агрегатов или агрегатов, содержащих вариант о(йегз, определяются из контекста [4.3.2). Х-мерный агрегат массива записывается как одномерный агрегат, содержащий (Х вЂ” 1)-мерный массив значений. 1.2.4.5. Атрибуты массивов 13.6.2) Следующие атрибуты определены для всех объектов индексируемого типа или ограниченного индексируемого подтипа А: А'НКЯТ Нижняя граница первого индекса; то же са- мое, что и А'Е)КВТ(1). А'Е(КЗТ(Х) Нижняя граница Х-го индекса.
А'ЬАЗТ Верхняя граница первого индекса; то же са- мое, что и А'ЬАБТ. А'ЬАЗТ(Х) Верхняя граница Х-го индекса. А'ЬЕХОТН Число элементов первого измерения (если индекс целый, то А'ЬЕХОТН = А'ЬАЗТ вЂ” А'Е)КВТ + 1); то же самое, что и А ' 1.ЕХОТН(1). А'1.ЕХОТН(Х) Число элементов Х-го измерения (если индекс целый, то А'ЬЕХОТН(Х) = А'ЬАЗТ(Х) — А'Е(КВТ(Х) + 1). А'КАХОЕп Подтип А'Е(КБТ..А'ЬАВТ, соответствующий правильным значениям для первого индекса; то же самое, что и А'КАХОЕ(1). А'КАХОЕ(Х) Подтип А'НКЗТ(Х)..А'ЬАВТ(Х), соответствующий правильным значениям Х-го индекса. " КА)чОе — плохой термин! Более соответсвует термин РОмАпч (область).
Область значений массива — это множество правильных индексов для массива, в то время как диапазон (КА)чОЕ) массива — это множество значений элементов. 1.2.5. Записи 13.71 Запись — зто составной объект из компонент, каждая из которых имеет имя и которые могут быть различных типов (компоненты записи являются гетерогенными, в то время как компоненты массива — гомогенными). Именуемый тип определяется следующим образом: косого описание компонент ~ пвП епд гесоп1 Описание компонент определяет одну или более компонент. Их тип задается именем типа или подтипа, за которым следует факультативное ограничение Если запись не содержит компонент, то описание именуемого типа должно содержать зарезервированное слово ппП; такая запись называется пустой записью.
Компонента С объекта именуемого типа К указывается с помощью поименованной компоненты К.С. Вот некоторые примеры именуемых типов: гуре РОБ1Т1ОХ Ь гесогд Х, У: Р(.ОАТ; епо гесоп1; гуре БЕО1.1ЕХСЕ Ь гесогя( БЕО: ЯТК1ХО (1..МАХ 31ЕЕ); Е: РОБ1Т1ЧЕ ганге 1..МАХ Б1г.Е; епо гесоп1; гуре ПАТЕ Ь гесоп1 УЕАК: 1ХТЕОЕК гапйе 1901..2099; МОХТН: 1ХТЕОЕК гапке 1..12; РАУ: 1ХТЕОЕК ганге 1..31; епо гесоп1; Объектам именуемого типа можно задать неявные начальные значения, указав их для компонент записи при описании именуемого типа'з.
Неявные начальные значения могут быть подавлены явным указанием необходимых начальных значений. Например, всем объектам типа РОЯТ(ОХ можно задать неявные начальные значения (0.0, 0.0), описав РОЯТ1ОХ следующим образом: гуре РОБ1Т1ОХ Ь гесоп1 Х, У: Р ОАТ:= 0.0; епд гесоп1 В результате после задания описаний Р1: РОЯ1Т1ОХ; — неявная инициализация Р2: РОЯ1Т1ОХ:= (1.0, 1.0); — явная инициализация Р1.Х и Р1Х имеют значения 0.0, а Р2.Х и Р2Ч вЂ” значения 1.0. н Неявные значения лля объектов типа Т можно указывать только в случае, если Т вЂ” именуемый тип! Ввв вняв 33 Использование записей покажем на примере функции )г1БТА)чСЕ (длина), которая вычисляет расстояние между двумя точками (х7, у7) и (х2, у2) по формуле Описание функции )г!БТА)чСЕ имеет вид (впсбоп 1)1БТА(чСЕ (Р1, Р2: РОБ1Т10)ч) гегвгп Р ОАТ 1я )зей)п ге(пгп Б()КТ ((Р1.Х вЂ” Р2.Х) вв2 + (РЬ г' — Р2.г) *э2); епо; где Б()КТ вЂ” это определяемая пользователем функция вычисления квадратного корня.
1.2.5.1. Агрегаты записи 14.3.11 Значения записи, называемые агрегатами записи, можно непосредственно сконструировать из значений компонент. Агрегаты записи можно присваивать объектам именуемого типа. Значения должны задаваться всем компонентам независимо от того, существуют или нет неявные начальные значения всех компонент. Подобно агрегатам массивов, агрегаты записи могут быть позиционными или именными, В следующем примере агрегата записи используется тип РОБ1Т10)ч, опреде- ленный ранее, а также тип СОМРЬЕХ, имеющий описание гуре СОМРЬЕХ )в гесоп) К, 1: РЬОАТ; епд гесогй; Примером агрегата записи является (5.0, 6.0) Позиционное указание возможно, если тип можно определить из контекста; в противном случае агрегат необходимо квалифицировать с помощью типа, как показано в следующих примерах.
Тип агрегата указывается явно. РОБ(Т10(ч" (5.0, 6.0) СОМРЬЕХ' (5.0, 6.0) 1.2.6. Ссылочные типы 13.8, 4.1.31 Статические объекты создаются при их указании в описании. Динамические объекты создаются динамически и явно во время выполнения программы. Для создания динамических объектов используется генератор пев7. Число динамических объектов в отличие от числа статических объектов не фиксируется в программе — они могут по желанию создаваться и уничтожаться во время выполнения программы. Динамические объекты в отличие от статических объектов не Глава у имеют явных имен. На них ссылаются с помощью объектов ссылочного типа, которые указывают на инхп. Генератор пегч возвращает значение ссылочного типа после того, как создан динамический объект. Это и есть то значение, которое необходимо использовать для ссылки на динамический объект.
Это значение ссылочного типа можно присвоить более чем одному объекту того же самого ссылочного типа. Таким образом, на динамический объект можно ссылаться, используя один или более объектов ссылочного типа; говорят, что объект, на который можно ссылаться с помощью двух или более объектов, обладает синонимией. Ссылочный тип определяется следующим образом: ассеяз Т «ограничение! где Т вЂ” имя типа или подтипа, а ограничение — это дискриминант или ограничение индекса.
Объекты такого ссылочного типа используются для ссылки на объекты типа Т. Значение пн!1 связывается со всеми ссылочными типами. Все объекты ссылочного типа получают значение ппй в качестве неявного начального значения. Значение пв!1 показывает, что не существует объекта, на который можно ссылаться с помощью объекта ссылочного типа. Использование этого значения для ссылки на динамический объект приводит к возникновению ошибки. Приведем несколько примеров описаний ссылочных типов: !уре Т1ТЬЕ !и ассезз БТК1ХО «1, 40); — ссылки на строки длины 40 !уре 1.ОСАТ1ОХ !з асеева РОБ1Т1ОХ; гуре Р«О«)КЕ !я асеева ОЕОМЕТК1С Р«О!)КЕ; Динамические объекты создаются во время выполнения программы с помощью вызова генератора, который имеет вид пезч Т !«выралгение) ~ 'агрегат ~ дискриминант или ограничение индекса « где Т вЂ” имя типа или подтипа.
Во время создания объекта ему можно явно задать начальное значение. Если Т вЂ” неограниченный тип, то ограничение или начальное значение задаются прн создании динамического объекта типа Т. Используя описания объектов ссылочного типа Т1, Т2: Т1ТЬЕ; А, В: ЬОСАТ1ОХ; Р: Р1013КЕ; " Ссьзлочные типы — зто действительно указатели! В языке Ада используется другая терминология во избежание появления ассоциаций с ненадежностью, обычно присущей указателям. Также отметим, что в языке Ада на ссылочные типы накладывается больше ограничений по сравнению с числом ограничений, которое имеют указатели в других языках программирования. Отсутствие ограничений на указатели, как зто имеет место в языке ПЛ/1, позволяет указателям ссылаться на объекты любых типов.