7. Процедуры и функции
49
процедуры или функции. Изменения этого формального параметра в теле процедуры
или функции не отражаются на значение соответствующего фактического параметра.
Соответствующий формальному параметру-значению фактический параметр в
операторе процедуры или при обращении к функции может быть выражением и не
может быть файлового типа.
Фактический параметр должен соответствовать по типу формальному
параметру-значению (совместимость по присваиванию).
7.3.2. Формальные параметры-переменные
Формальные параметры-переменные (параметры передаются по адресу)
используются когда необходимо передать значение из процедуры или функции к тому,
кто обращался к ним. Соответствующий фактический параметр из списка фактических
параметров должен быть именем переменной. Формальный параметр-переменная
представляет собою фактический параметр во время вызова процедуры или функции,
так что каждое изменение значения формального параметра отражается на значение
фактического параметра.
Тип фактического параметра должен быть идентичным типу формального
параметра. Переменные типа файл можно передавать в качестве параметров только
как параметры-переменные.
Компоненты упакованного типа нельзя сопоставлять формальным параметрам-
переменным.
7.3.3. Формальные параметры-константы
Параметры-константы в UniPascal-е являются расширением ISO Pascal-я.
Компилятор не разрешает изменения их значений в теле процедуры (т.е. им
невозможно присвоит значение и их невозможно передать в качестве параметров-
переменных другой процедуре). Когда они простого типа, параметры-константы
передаются по значению, а если их тип составной, они передаются по адресу. Тем
самым экономится память и время.
В качестве примера рассмотрим следующую функцию, вычисляющую
детерминант матрицы 3x3, тип которой дефинирован как matrix_3x3.
 var matrix_3x3 = array [1..3, 1..3] of real;
function determinant(const a: matrix_3x3): real;
begin
determinant:= a[1, 1] * a[2, 2] * a[3, 3] +
a[2, 1] * a[3, 2] * a[1, 3] +
a[1, 2] * a[2, 3] * a[3, 1] -
a[1, 3] * a[2, 2] * a[3, 1] -
a[2, 1] * a[1, 2] * a[3, 3] -
a[3, 2] * a[2, 3] * a[1, 1];
end { determinant };
Если перед формальным параметром не стоит зарезервированное слово
CONST, фактический параметр будет передаваться по значению. А значение массива
состоит из значений всех его элементов, т.е. функции будут переданы 9 вещественных
чисел. На выполнение этой передачи уходит время и память. Обычно в таких случаях
программисты продпочитают использовать параметр-переменную. Если параметр
стандартного типа STRING, то возникают неприятности, связанные с использованием
<<  <  GO  >  >>

Вернуться к началу сайта