Чет про программирование / 13) Процедуры и функции
.docxПроцедуры и функции
Подпрограмма - это отдельная функционально независимая часть программы. Любая подпрограмма обладает той же структурой, которой обладает и вся программа.
Подпрограммы решают три важные задачи:
-
избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты;
-
улучшают структуру программы, облегчая ее понимание;
-
повышают устойчивость к ошибкам программирования и непредвидимым последствиям при модификациях программы.
Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными (пользовательскими), т.е. определенными программистом.
В стандартных модулях содержится большое количество стандартных подпрограмм, но большую роль в создании программ играют собственные подпрограммы, которые создает программист для решения конкретной задачи.
По своей структуре они очень напоминают программу и состоят из заголовка и блока. Заголовок процедуры состоит из зарезервированного слова procedure, имени процедуры и необязательного заключенного в круглые скобки списка формальных параметров. Имя процедуры - это идентификатор, уникальный в пределах программы. Формальные параметры - это данные, которые вы передаете в процедуру для обработки, и данные, которые процедура возвращает. Если процедура не получает данных извне и ничего не возвращает, формальные параметры (в том числе круглые скобки) не записываются. Тело процедуры представляет собой локальный блок, по структуре аналогичный программе:
-
procedure <имя процедуры> ( <список формальных параметров> ); const ...; type ...; var ...; begin <операторы> end;
Описания констант, типов данных и переменных действительны только в пределах данной процедуры, они называются локальными. В теле процедуры можно использовать любые глобальные константы и переменные, а также вызывать любые подпрограммы (процедуры и функции).
Вызов процедуры для выполнения осуществляется по ее имени, за которым в круглых скобках следует список фактических параметров, т.е. передаваемых в процедуру данных:
-
<имя процедуры> ( <список фактических параметров> );
Аналогично в ЯП Паскаль описываются и вызываются пользовательские функции, с тем отличием, что для функций в описании необходимо указать тип возвращаемого значения.
Параметры в процедуры и функции можно передавать 2 способами - по значению и по ссылке. Отличия между этими двумя способами следующие - при передаче параметра по значению в процедуру (функцию) передается копия переменной, а при передаче по ссылке - оригинал (сама переменная). Для передачи переменной по ссылке мы пишем ключевое слово var.
Директивы подпрограмм
Директивы дают дополнительную информацию компилятору о размещении подпрограмм.
-
Forward. Если одна подпрограмма использует другую, а та, в свою очередь, эту первую, то возникает проблема размещения этих подпрограмм в программе (ни одну из них нельзя поместить перед другой). Чтобы устранить это противоречие, используется директива forward. Сначала описывается полный заголовок первой процедуры с ключевым словом forward, затем полностью описывается вторая процедура, использующая первую, после чего полностью описывается первая процедура.
-
Inline. В отличие от других подпрограмм подпрограмма с директивой inline непосредственно добавляется всюду, где есть ее вызов (код процедуры вставляется в место вызова).
Перегрузка
В некоторых случаях возникает необходимость в написании подпрограмм, которые выполняют одинаковые логические действия, но над переменными разных типов данных.
В языке Паскаль существует возможность дать двум и более процедурам (функциям) одинаковые идентификаторы при условии, что все такие процедуры (функции) отличаются списком параметров. Такая возможность называется перегрузкой. Для указания того, что процедура (функция) перегружена, служит стандартная директива overload:
-
procedure Increment(var Value: Integer); overload;
-
procedure Increment(var Value: Real); overload;
Какую именно процедуру использовать в том или ином случае компилятор будет определять на этапе компиляции программы по типам фактических аргументов, передаваемых при вызове. Перегруженные процедуры и функции должны иметь одинаковое количество передаваемых переменных.
Запрещается также перегружать функции, которые отличаются лишь типом возвращаемого значения.
Соглашения о вызове подпрограмм
В различных языках программирования используются различные правила вызова подпрограмм. Для того чтобы из программ, написанных на языке Паскаль, возможно было вызывать подпрограммы, написанные на других языках (и наоборот), в языке Паскаль существуют директивы, соответствующие четырем известным соглашениям о вызове подпрограмм: register, stdcall, pascal, cdecl.
Директива, определяющая правила вызова, помещается в заголовок подпрограммы.