- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •98 Глава 4
- •4.9.3. Полнота
- •100 Глава 4
- •4.9.5. Операции egual, similar и copy
- •102 Глава 4
- •104 Глава 4
- •5. Исключительные ситуации
- •108 Глава 5
- •110 Глава 5
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •112 Глава 5
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •114 Глава 5
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •116 Глава 5
- •118 Глава 5
- •118 Глава 5
- •120 Глава 5
- •122 Глава 5
- •124 Глава 5
- •128 Глава 6
- •130 Глава 6
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •132 Глава 6
- •134 Глава 6
- •136 Глава 6
- •138 Глава 6
- •140 Глава 7
- •142 Глава 7
- •7.2. Абстракция данных
- •144 Глава 7
- •146 Глава 7
- •148 Глава 7
- •150 Глава 7
- •7.4. Генераторы
- •162 Глава 7
- •154 Глава 7
- •156 Глава 7
- •162 Глава 8
- •164 Глава 8
- •166 Глава 8
- •168 Глава 8
- •170 Глава 9
- •172 Глава 9
- •174 Глава 9
- •176 Глава 9
- •9.1.3. Пример
- •178 Глава 9
- •180 Глава 9
- •182 Глава 9
- •184 Глава 9
- •186 Глава 9
- •188 Глава 9
- •190 Глава 9
- •192 Глава. 9
- •194 Глава 9
140 Глава 7
Мы предполагаем только незначительное знакомство читателя с языком Паскаль и будем пояснять необычные свойства этого языка по мере их использования. В настоящее время используется много диалектов языка Паскаль, В основном мы пытались ограничиться некоторым подмножеством языка Паскаль, которое является общим для большинства диалектов. Однако часть примеров, приведенных в этой главе, нельзя откомпилировать на некоторых диалектах языка Паскаль. Все наши программы были откомпилированы и просчитаны в системе Турбо-Паскаль.
7.1. Абстракции процедур и функций
В языке Паскаль операции, которые возвращают значения, называются функциями, а те операции, которые не возвращают значения, — процедурами. Мы будем использовать слово операция, когда паши рассуждения касаются и функций, и процедур.
Между процедурами языка CLU и операциями языка Паскаль имеется несколько важных различий. Наиболее существенными являются следующие: 1) операции языка Паскаль могут читать и модифицировать переменные, которые являются глобальными по отношению к вызванной операции; 2) формальные параметры языка Паскаль объявляются или типом var, или по значению. В языке CLU механизмы передачи аргументов совершенно различные; 3) функции языка Паскаль могут вернуть только один аргумент, и этот аргумент должен принадлежать к довольно ограниченному набору типов; 4) в языке Паскаль нет механизма обработки исключительных ситуаций.
7.1.1. Глобальные переменные
Существуют ситуации, в которых глобальные переменные полезны. Больше всего это заметно тогда, когда надо сохранить некоторое состояние между вызовами процедуры. (Во многих других языках программирования это может быть использовано с применением собственных переменных. Описание собственных переменных языка CLU приводится в разд. А.8.5 приложения.)
В общем случае нецелесообразно проектировать абстракции, которые зависят от глобальных переменных, поскольку тогда значение такой абстракции будет зависеть от того контекста, в котором она находится. Это может существенно ограничить повторное ее использование. В этой главе мы не будем использовать глобальные переменные.
7.1.2. Передача параметров и возврат значений
В языке Паскаль имеется два механизма передачи параметров — параметры с типом var передаются по ссылке, а параметры не с типом var — по значению. При вызове по значению
Использование языка Паскаль
фактический аргумент является некоторым выражением (например, х + у). Такое выражение вычисляется, и его значение копируется в формальную переменную данной операции. При вызове по значению надо отметить два важных момента. Во-первых, модификация формального параметра не влияет на фактический параметр. Непонимание этого является частым источником ошибок в программах на языке Паскаль, Во-вторых, вызов по значению связан с накладными расходами для больших значений (например, массивов), поскольку надо выполнять их копирование.
При вызове по ссылке фактический параметр должен быть переменной или «псевдопеременной» (такой, как элемент массива). фактический параметр не может быть выражением. Формальный параметр можно представлять просто как другое имя фактического параметра, т. е. использование формального параметра в вызываемой операции эквивалентно использованию фактического параметра в вызывающей программе.
Функции языка Паскаль похожи на процедуры языка CLU тем, что они могут модифицировать свои аргументы и выдавать некоторый результат. Они могут, однако, возвратить только один результат, а на тип результата накладываются ограничения. В большинстве версий языка Паскаль возвращать можно только скалярные переменные и указатели, и это отразится на соглашениях, которые мы используем для реализации абстрактных типов.
7.1.3. Обработка исключительных ситуаций
При проектировании процедур языка CLU мы часто используем механизм обработки исключительных ситуаций этого языка. Иногда для указания того, что произошла некоторая ошибка, мы используем специальную процедуру обработки исключительных ситуаций failure. Чаще, однако, мы используем обработку исключительных ситуаций просто как еще один способ обмена информацией между вызываемой процедурой и вызывающей программой. В языке Паскаль мы используем различные соглашения для того, чтобы реализовать эти два различных способа применения обработки исключительных ситуаций.
Для обработки сбоев в программах на языке Паскаль мы задаем некоторую процедуру, называемую failure. Эта процедура помещается в начало программы, и к ней может обращаться любая другая операция в этой программе. Спецификация данной процедуры следующая:
procedure failure (s: error, msg)
modifies Выходной поток на основном устройстве вывода. effects Печатает следующую строку на основном устройстве вывода: "Сбой. Программа окончилась из-за:" + s, а затем выполнение программы останавливается.
