ПАРАМЕТРЫ
В описании процедуры или функции задается список формальных параметров. Каждый параметр, описанный в списке формальных параметров, является локальным по отношению к описываемой процедуре или функции и в модуле, связанным с данной процедурой или функцией на него можно ссылаться по его идентификатору.
Существует три типа параметров:
значение,
переменная и
нетипизированная переменная .
Они характеризуются
следующим:
1) Группа параметров, перед которыми отсутствует ключевое слово var и за которыми следует тип, является списком параметров- значений .
2) Группа параметров, перед которыми следует ключевое слово var и за которыми следует тип, является списком параметров-переменных .
3) Группа параметров, перед которыми стоит ключевое слово var и за которыми не следует тип, является списком нетипизованных параметров-переменных.
Параметры-значения
Формальный параметр-значение обрабатывается, как локальная по отношению к процедуре или функции переменная, за исключением того, что он получает свое начальное значение из соответствующего фактического параметра при активизации процедуры или функции. Изменения, которые претерпевает формальный параметр-значение, не влияют на значение фактического параметра.
Соответствующее фактическое значение параметра-значения должно быть выражением и его значение не должно иметь файловый тип или какой-либо структурный тип, содержащий в себе файловый тип.
Фактический параметр должен иметь тип, совместимый по присваиванию с типом формального параметра-значения. Если параметр имеет строковый тип, то формальный параметр будет иметь атрибут размера, равный 255.
Параметры-переменные
Параметр-переменная используется, когда значение должно передаваться из процедуры или функции вызывающей программе.
Соответствующий фактический параметр в операторе вызова процедуры или функции должен быть ссылкой на переменную.
Параметры-переменные
При активизации процедуры или функции формальный параметр-переменная замещается фактической переменной, любые изменения в значении формального параметра-переменной отражаются на фактическом параметре.
Внутри процедуры или функции любая ссылка на формальный параметр-переменную приводит к доступу к самому фактическому параметру.
Параметры-переменные
Тип фактического параметра должен совпадать с типом формального параметра-переменной (вы можете обойти это ограничение с помощью нетипизованного параметра-переменной).
Если формальный параметр имеет строковой тип, ему присваивается атрибут длины, равный 255, и фактический параметр должен также иметь строковой тип и атрибут длины, равный 255.
Область действия идентификаторов при использовании процедур и функций.
Областью действия идентификатора называется часть про-
граммы, где он может быть использован. Область действия
идентификаторов определяется местом их объявления. Если
идентификаторы допускается использовать только в рамках
одной процедуры или функции, то такие идентификаторы,
как уже говорилось выше, называются локальными, а если
действие идентификаторов распространяется на несколько
вложенных процедур и/или функций, то такие идентифика-
торы называются глобальными.
Заметим, что понятие “глобальные” и “локальные”
следует понимать относительно по отношению к
конкретной процедуре или функции.
Продемонстрируем это на следующем примере :
program S ;
var A0,B0,C0: integer;
procedure P1;
var A1,B1,C1: integer;
procedure P2;
var A2,B2,C2: integer;
begin Допустимо использование как глобальных
A0,B0,C0,A1,B1,C1 так и локальных А2,В2,С2
end;
begin
Допустимо использование как глобальных А0, В0
и С0, так и локальных А1,В1 и С1
end;
begin
Допустимо использование только А0, В0 и С0.
End.
Данные А2, В2 и С2, объявленные в самой внутренней процедуре Р2, будут только локальными.
А1, В1 и С1 будут глобальными для процедур и функций, описанных внутри процедуры Р1 и локальными для самой процедуры Р1 .
В данном примере А0, В0 и С0 будут глобальными для всех процедур и функций, используемых в программе.
Сформулируем правила определения области действия для идентификаторов процедур и функций:
1. Действуют все идентификаторы, определенные внутри
процедуры/функции;
2. Действуют все идентификаторы окружающего контекста, если их имена отличаются от имен, объявленных внутри процедуры/функции;
- Локальные идентификаторы процедуры/функции во внешнем окружении действовать не будут никогда (при выходе их процедуры/функции компьютеры о них забывает!)
- В случае совпадения имен глобального и локального идентификаторов действовать будет только внутренний локальный идентификатор.
Если первые три правила поясняются рассмотренным примером,
то для пояснений четвертого приведем еще один пример:
program S2;
var A,B,C: integer;
procedure P1;
var A,B,C: real;
procedure P2;
var A,B,C: char;
begin
A,B,C- символьные переменные и только!
end;
begin
Допустимо использование А, В и С, как
действительные переменные
end;
begin
Допустимо использование только А, В и С-целые,.
End.
То есть, объявление во внутренней процедуре данных с идентификаторами, совпадающих по имени с данными внешних процедур, отменяет действие внешних идентификаторов и вводит свои локальные описания, независимо от того совпадают они по типу, или нет.
Локальные данные создаются при вызове процедуры/функции и существуют только во время ее выполнения. Выделение памяти для локальных данных происходит автоматически в начале выполнения процедуры/функции, а освобождается эта память - как только выполнение процедуры/функции заканчивается.
Операторы, расположенные в теле процедуры/функции могут обращаться к ее локальным данным и изменять их значения. Однако эти значения существуют только, пока процедура /функции работает!!!
Как только она прекращает свою работу,
все изменения значений локальных данных,
исчезнут вместе с освобождением памяти!!!
И еще несколько правил!
- Если Вы хотите получить результат, полученный в процедуре/ функции и использовать в программе, то необходимо формальный соответствующий параметр oбъявить как переменную с ключевым словом VAR в списке параметров.
- При вызове процедуры указывать константы в качестве параметров (в виде чисел или условных обозначений-имен) можно только в том случае, если соответствующий параметр в объявлении процедуры не имеет атрибута VAR, т.е. объявлен как параметр-значение.
3) При вызове процедуры/функции не ставить на место фактических параметров различные выражения.
4) Оформлять подпрограмму как функцию целесообразно только в том случае, если ожидается некоторый результат работы подпрограммы. Если же последовательность команд ориентирована на выполнение некоторого действия или действий, целесообразно оформлять ее как процедуру.