| CONST
| >SQRMAX =100; { локальная простая константа }
| BEGIN { начало тела процедуры }
| { В X запишется квадрат его последнего значения: }
| > X := X * X;
| { Результат сравнения запишется в глобальный флаг: }
| > GlobalFlag := ( X > SQRMAX );
| >if GlobalFlag then
| > X:=SQRMAX; { ограничение X }
| > Sq := X { возвращение значения }
| >END; { конец тела процедуры }
| VAR
| > SqGlobal : Real;
| BEGIN { основной (вызывающий) блок }
| > GetSQR ( 5, SqGlobal );
| > WriteLn( SqGlobal, ' Флаг: ', GlobalFlag )
| END.
Рис. 6.7
Оставим ненадолго процедуры и рассмотрим функции. Идентификатор функции возвращает после вызова скалярное значение заданного типа. Для присвоения функции значения ее имя должно хотя бы однажды появиться в левой части оператора присваивания в теле самой функции. Вызов функции производится уже не обособленно, а в том месте, где необходимо значение функции (в выражениях, вызовах других подпрограмм и т.п.). Например, процедуру GetSQR на рис. 6.7 можно переписать в виде функции (рис. 6.8).
| >VAR GlobalFlag : Boolean; { глобальный флаг }
| >FUNCTION GetSQR( X : Real ) : Real;
| >CONST SQRMAX =100;
| BEGIN
| > X := X*X;
| > GlobalFlag:=(X>SQRMAX);
| >if GlobalFlag then X:=SQRMAX;
| > GetSQR := X { возвращение значения }
| END;
Рис. 6.8
- 111 -
| BEGIN { основной (вызывающий) блок }
| > WriteLn( GetSQR( 5 ), ' Флаг: ', GlobalFlag )
| END.
Рис. 6.8 (окончание)
Вызов заметно упростился, не говоря уже о сокращенной переменной SqGlobal. Возвращаемое функцией значение должно быть скалярного или строкового типа, т.е. не может быть файлом, массивом, записью, множеством, объектом.
Функция, как и процедура, может обмениваться значениями с программой и изменять глобальные переменные непосредственно или через параметры-переменные. Обычно, когда функция, кроме выдачи своего значения, меняет какие-либо глобальные значения или производит другие действия, не связанные с вычислениями своего значения, говорят, что она имеет побочный эффект.
Большое значение имеет соблюдение правил соответствия типов при подстановке параметров. Нельзя (да и не получится — компилятор не пропустит!) конструировать типы в описаниях параметров. Можно использовать только уже известные идентификаторы типов. То же самое можно сказать о типе возвращаемого значения функции. И, конечно, число и порядок следования параметров в вызове должен соответствовать описанию процедуры или функции. Кроме того, в Турбо Паскале существует правило, требующее, чтобы параметры, имеющие файловый тип (или сложный тип с файловыми компонентами), были обязательно описаны как