Процедуры и функции. Процедурные типы. Тип указатель.

Модификаторы VAR и CONST в описании формальных параметров.

Если не указывать никаких модификаторов, то при передаче фактических параметров в процедуру или функцию создается временная копия значения фактического параметра, которая используется в процедуре или функции и удаляется после выхода. При использовании модификатора VAR в качестве формального параметра передается переменная (точнее ссылка на переменную). Значение переменной, переданной по ссылке, можно изменить внутри процедуры или функции. При этом изменится и значение переменной, указанной в качестве параметра.

Таким образом, можно использовать этот способ передачи параметров, например для возврата процедурой или функцией, если это необходимо, сразу нескольких значений. Заметьте, что в этом случае значения может возвращать и процедура. Существуют случаи, когда передавать переменные по ссылке, а не по значению обязательно. Часто этот модификатор применяется для переменных составных типов (например, строк и массивов).

Модификатор CONST применяется в основном для переменных составных типов в случае, когда значение параметра внутри процедуры или функции изменять не требуется. В этом случае не создается временная копия значений параметров, а, как и при использовании модификатора VAR, переменные передаются по ссылке, что сокращает время на создание копии больших составных переменных. Передавать значения по ссылке допускается, так как можно быть уверенным, что, как и при обычной передаче параметров, значение переменных не изменится. Если попытаться изменить значение параметра, описанного с модификатором CONST, будет выдано сообщение об ошибке.

Локальность и область действия.

Все описания, находящиеся в описательной части процедуры или функции, являются локальными для нее и недоступны в основной программе или в других процедурах и функциях. Переменные, описанные в основной программе, являются глобальными и доступны всем процедурам и функциям. Локальные переменные, в отличие от глобальных, не существуют до вызова процедуры или функции, в которой они описаны. При входе в процедуру или функцию для локальных переменных динамически выделяется память, а при выходе эта память освобождается.

Необходимо заметить, что значения типизированных констант, где бы они ни были описаны, являются глобальными, т.е. если в процедуре или функции описана типизированная константа, то для нее уже выделена память и ей присвоено конкретное значение. Если в процедуре или функции поменять это значение, то при следующем вызове измененное значение типизированной константы сохранится.

Процедурные типы

Напишем функцию для численного интегрирования, к примеру, функции sin x+ x/2.

Предположим теперь, что в программе необходимо интегрировать несколько функций, причем для вычисления значений некоторых из них вполне может понадобиться писать целую отдельную программу. Что делать в этом случае? Написать несколько почти одинаковых функций для каждого случая? Необходимо заметить, что в реальной задаче могут использоваться и значительно более сложные вычисления, для которых может понадобиться написание достаточно объемной программы. Придется несколько раз продублировать эту программу, меняя в ней лишь небольшой участок. В таких случаях можно использовать процедурные типы. Перепишем вышеприведенную функцию Integr с использованием процедурных типов.

Теперь в качестве параметров передаются не только отрезок интегрирования и количество участков, но и функция, которую необходимо интегрировать. Таким образом, теперь можно интегрировать любую функцию без необходимости многократно дублировать код.

Тип указатель

Переменная типа указатель содержит адрес некоторой переменной описанного типа. Рассмотрим на примере тип указатель, а также оператор взятия адреса @ и оператор разыменования указателя ^.

После выполнения первых трех операторов присваивания переменные примут значения, приведенные на следующем рисунке (расположение переменных в памяти взято для примера).

Нулевой указатель.

Записывается NIL и означает, что переменная типа указатель не указывает ни на что. Возвращаясь к процедурным типам, скажем, что значение NIL можно присваивать и переменным такого типа (так как, по сути, они являются указателями и содержат адреса соответствующих процедур и функций). В данном случае это будет означать, что переменная не указывает ни на какую процедуру или функцию. Чтобы определить адрес процедуры или функции, на которую указывает переменная процедурного типа (например, для сравнения с NIL), нужно использовать оператор взятия адреса @.

КОММЕНТАРИИ