На основе процедуры Halt можно легко построить программу, например ASK.PAS, для организации диалога в ВАТ-файлах MS-DOS (рис. 6.4).
| VAR i : Word; { ======ПРОГРАММА ASK.PAS ======== }
| BEGIN
| { ...вывод на экран текста альтернатив выбора... }
| Write( 'Введите Ваш выбор: ');
| ReadLn(i); { ввод номера альтернативы с экрана)
| Halt(i) { остановка программы и назначение }
| END. { ERRORLEVEL в MS-DOS номера i }
Рис. 6.4
Теперь в ВАТ-файле надо запускать откомпилированную программу ASK.EXE и сразу после нее анализировать, что будет находиться в переменной MS-DOS ERRORLEVEL.
Имеет смысл при нескольких вызовах Halt в тексте программы назначать им разные коды завершения. Тогда можно будет при отладке или работе определить, чем вызвано прерывание программы.
6.9. Процедуры и функции
В этом разделе будут рассмотрены вопросы, связанные с написанием и употреблением подпрограмм, представленных в виде процедур или функций.
Определить простейшую процедуру довольно просто: практически любой составной оператор, вынесенный из основного блока программы и объявленный предложением
PROCEDURE ИмяПроцедуры;
становится процедурой, и вместо этого составного оператора в основном блоке может подставляться одно лишь ИмяПроцедуры.
Согласно более общему определению процедура может иметь параметры, метки перехода внутри себя и свои, локальные, переменные (рис. 6.5). Обязательными элементами процедур и функций тоже является заголовок и тело, т.е. тот же составной оператор.
Синтаксис вызова процедуры прост. Ее выполнение активизируется указанием ее имени и списком переменных или значений, подставляемых на место параметров:
ИмяПроцедуры(Параметр1, Параметр2,);
- 107 -
PROCEDURE ИмяПроцедуры (ПарамЗнач1 : ТипЗнач1;
ПарамЗнач2 : ТипЗнач2;
VAR ПарамПерем1 : ТипПерем1;
VAR ПарамПерем2 : ТипПерем2; ... );
LABEL
Перечисление меток внутри тела процедуры
CONST
Описание локальных констант процедуры
TYPE
Описание локальных типов
VAR
Описание локальных переменных
Описание вложенных процедур и (или) функций
BEGIN
Тело процедуры
END;
Рис. 6.5
Общая структура функций совпадает с процедурами, за исключением заголовка. Он записывается как
FUNCTION ИмяФункции( Список параметров ) :
ИмяСкалярногоТипаЗначенияФункций;
Что и как может возвращать функция при ее вызове, мы рассмотрим чуть позже.
Нетрудно заметить, что структура подпрограмм копирует структуру программы в целом (не считая заголовка и завершающей точки с запятой вместо точки после END). Порядок следования разделов описаний подчиняется тем же правилам, по которым строится вся программа.
6.9.1. Параметры. Глобальные и локальные описания
Поскольку процедуры и функции должны обладать определенной независимостью в смысле использования переменных (а также типов и констант), при их введении в программу возникает разделение данных и их типов на глобальные и локальные. Глобальные константы, типы, переменные — это те, которые объявлены в программе вне процедур или функций. Наоборот, локальные — это константы, типы и переменные, существующие только внутри процедур или функций, и объявленные либо в списке параметров (только переменные), либо в разделах CONST, TYPE, VAR внутри процедуры или функции.
- 108 -
Процедуры и функции могут, наряду со своими локальными данными, использовать и модифицировать и глобальные. Для этого нужно лишь, чтобы описание процедуры (функции) стояло в тексте программы ниже, чем описания соответствующих глобальных типов, констант и переменных (рис. 6.6).
PROGRAM Main;
| VAR
| Xmain, Ymain : LongInt; {глобальные переменные}
| Res : Real;
| PROCEDURE Proc1( a,b : Word; VAR Result : Real );
| VAR
| Res : Real; { локальная Res, закрывающая глобальную }
| BEGIN
| Res := a*a + b*b; { локальные действия }
| Result:= Xmain+Ymain*Res; {работают глобальные значения}
| Xmain := Xmain+1; { модифицируется глобальное значение}
| END;
TYPE
CONST Другие глобальные объявления, уже
VAR недоступные из процедуры Proc1;
BEGIN
Основной блок, в котором может вызываться Proc1
END.
Рис. 6.6