Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
45
Добавлен:
23.03.2015
Размер:
884 Кб
Скачать

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, а затем выполнение программы останавливается.

Соседние файлы в папке POSIBNIK