Top.Mail.Ru

Turbo Pascal. Глобальные и локальные идентификаторы

Областью действия идентификатора (параметра) называется часть программы, где он может быть использован.

Область действия идентификаторов определяется местом их объявления. Область действия означает, что переменная является доступной в этой области.

Локальными называют идентификаторы, которые доступны только в одной подпрограмме.

Глобальными называют идентификаторы, которые доступны в любой вложенной подпрограмме.

Для упрощения дальнейшего изложения материала программу и подпрограммы будем называть блоками.

Пример. Рассмотрим ситуацию, представленную на рисунке ниже, где схематично представлена программа (блок 1) , имеющая подпрограмму (блок 2).

 Блок 1

 Var 
 Y: real; 
 X: integer; 
 Begin 

 X:=10;    Блок 2

 Var 
 Z: integer; 
 X: integer; 
 Begin 

 X:=20;
End;
 

End.

Идентификатор Y описан только в блоке 1. Блок 2 является внутренним или вложенным блоком. Поэтому областью действия идентификатора Y является блок 1 и блок 2, т.е. идентификатор Y является доступным и в блоке 1 и в блоке 2. Следовательно, идентификатор Y является глобальным.

Идентификатор Z описан в блоке 2 и областью его действия является только блок 2, следовательно, является локальным. В блоке 1 идентификатор Z недоступен или говорят, не определен.

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

Идентификатор X описан и в блоке 1, и еще раз в блоке 2. Но это разные переменные! Идентификатор X блока 1 при входе в блок 2 теряет свою силу. С блоком 2 связан свой идентификатор X. Например, X в блоке 1 может означать количество чисел, а в блоке 2 сумму чисел. При выходе из блока 2 идентификатор X вновь приобретает смысл, вложенный при его описании в блоке 1.

Например, до входа в блок 1 X имеет численное значение равное 10. В блоке 2 значение X будет равно 20, но при выходе из блока X снова будет равно 10.

Для того чтобы не возникали ошибки, следует учитывать следующие правила:

  • не следует использовать одинаковые имена для глобальных и локальных переменных;
  • в случае совпадения имен глобального и локального идентификатора действовать будет только локальный идентификатор;
  • локальные идентификаторы во внешней подпрограмме не действуют;
  • если имена отличаются, идентификаторы действуют во всех внутренних подпрограммах;
  • следует избегать совпадения имен формальных и фактических параметров.

Способы передачи параметров

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

Существуют три основных способа передачи параметров, в соответствии с которыми делятся формальные параметры:

  • параметры-значения(эти параметры подпрограмма не может изменить в основной программе);
  • параметры-переменные (эти параметры подпрограмма может изменить в основной программе);
  • параметры-константы (эти параметры подпрограмма не может изменить в основной программе).

Параметры-значения

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

Параметры-значения передаются в виде их копий и, следовательно, фактический параметр программы подпрограммой измениться не может.

Заголовок процедуры с параметрами-значениями:

 procedure A1 (p1,p2:; p3,p4:; p5,p6:); 

здесь p1...p6 – формальные параметры.

Пример. В качестве примера приведем процедуру поиска максимального элемента (задача 2 из урока "Процедуры и функции"). В процедуре в качестве формальных параметров мы использовали только параметры значения:

 proceduremax_el_array(b:mas;t:integer); 

Фактические параметры подставляли при вызове процедуры:

 max_el_array(a;m); 

При вызове выделяется память под массив b и переменную t и в порядке следования выполняется копирование значений массива a и переменной t. Далее выполняются вычисления с массивом b, переменной t и формируется результат. Значения фактических параметров недоступны и поэтому не могут быть изменены.

Недостатками использования параметров-значений являются:

  • расходуется дополнительно память на создание копий;
  • происходит потеря быстродействия работы программы.

Преимущество:

  • нельзя случайным образом изменить значения фактических параметров.

Параметры-переменные

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

При передаче параметров-переменных в подпрограмму передаются адреса фактических параметров в порядке, объявленном в заголовке подпрограммы. Следовательно, подпрограмма имеет доступ к фактическим параметрам и может их изменять.

Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово VAR. Действие слова VAR распространяется до ближайшей точки с запятой.

Заголовок процедуры с параметрами-переменными:

 procedure A1(var p1,p2:; var p3,p4:; var p5,p6:); 

здесь: p1...p6 – формальные параметры.

Рассмотрим пример. В процедуре нахождения суммы (задача 1 из урока "Процедуры и функции")

 procedure summa(b:mas;var t:integer); 

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

ЗАДАЧА 1. Ввести с клавиатуры 15 вещественных чисел в массив и найти сумму этих чисел с помощью процедуры с параметром-переменной.

program a24;

Const n=15;
Type
mas=array[1..n] of real;
Var
a:mas;
i:integer; {параметр цикла}
sum:real; {сумма чисел}
{----описание процедуры----}
procedure summa(b:mas; var s:real; t:integer);
{b – массив}
{t - количество чисел}
{введен формальный параметр s, как параметр-переменная, для того чтобы возвратить результат в основную программу}
var
{----объявление внутренней переменной----}
i:integer; {параметр цикла}
begin
s:=0;
for i:=1 to t do s:=s+b[i];
end; {конец процедуры}
begin
write(‘Введите ’, n:4,’ чисел’);
for i:=1 to n do
begin
write(‘a[‘,i,’]=’);
readln(a[i]);
end;
summa(a,sum,n);
{вызов процедуры summa, сумма n чисел}
writeln(‘Сумма чисел равна:’, sum:8:2);
summa(a,sum,10);
{вызов процедуры summa, сумма 10 чисел}
writeln(‘Сумма равна:’, sum:8:2);
End.

Этот вариант решения задачи лучше, чем решение в задаче 1 из урока "Процедуры и функции" тем, что не создается копия исходного массива a, что улучшает быстродействие программы. Однако при такой передаче параметров возможно непреднамеренное изменение фактических параметров.

Параметры-константы

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

При передаче параметров-констант в подпрограмму передаются адреса фактических параметров в порядке, объявленном в заголовке подпрограммы. Подпрограмме запрещено изменять фактические параметры.

Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово Const. Действие слова Const распространяется до ближайшей точки с запятой.

Заголовок процедуры с параметрами-константами:

 procedure A1(const p1,p2:; const p3,p4:; const p5,p6:); 

здесь p1...p6 – формальные параметры.

Параметры константы целесообразно использовать в случаях, когда требуется передать данные большого размера (массивы, записи и т.д.), но изменять значения данных подпрограмма не должна. Использование параметров-констант обеспечивает экономное расходование памяти, повышает быстродействие программы и гарантирует неизменность исходных данных.

Пример. Запись заголовка процедуры суммирования (задача 3 из урока "Процедуры и функции") с формальным параметром-константой:

 procedure summa(const b:mas; var s:real; t:integer);