Вопрос6.
Параметры-значения используются только для передачи исходных данных в подпрограмму. По умолчанию параметры процедур и функций
считаются переданными по значению.
В данном случае подпрограмме передается только значение параметра, которое помещается в специально созданную переменную. Таким образом, при работе с формальным параметром используется копия фактического параметра. Значения формальных параметров может изменяться в подпрограмме, но на значениях фактических параметров это не отражается.
Пример:
procedure summ(x, y :integer; s :longint);
begin
s := x + y;
writeln('Сумма = ', s); {на экран будет выведено значение суммы}
end;
var a, b :integer;
c :longint;
begin
c := 0;
write('Введите a:'); Readln(a);
write('Введите b:'); Readln(b);
summ(a,b,c);
writeln('Сумма = ',c); {
на экран будет выведено:
Сумма = 0}
end.
Параметры-переменные используются для передачи данных в подпрограмму и возврата результатов работы. В списке формальных параметров перед ними ставится ключевое слово var.
Каждому формальному параметру-переменной должен соответствовать фактический параметр обязательно в виде переменной
При работе с формальным параметром используется память фактического параметра. Поэтому изменение значений формальных параметров приводит к изменению значений фактических параметров.
Тот же пример (в заголовке функции добавлено ключевое слово var):
procedure summ(x, y :integer; var s :longint);
begin
s := x + y;
end;
var a, b :integer;
c :longint;
begin
c := 0;
write('Введите a:'); Readln(a);
write('Введите b:'); Readln(b);
summ(a,b,c);
writeln('Сумма = ',c); {на экран будет выведено значение суммы}
end.
Вопрос 7
Областью видимости идентификатора (переменной, константы, процедуры, функции и др.) называется часть программы, где он может быть использован. Область видимости идентификаторов определяется местом их объявления. Все идентификаторы, которые описываются в подпрограмме, являются
локальными. Идентификаторы, описанные в программе, являются глобальными. Если
они описаны перед объявлением процедур и функций, то ими можно пользоваться в данных процедурах и функциях. Подпрограмма может содержать описание внутренних процедур и
функций, причем допускается любой уровень вложенности. Тогда идентификаторы, описанные в вызывающей подпрограмме, являются
глобальными по отношению к вызываемой подпрограмме. Поэтому понятия «глобальный» и «локальный» относительны для каждой процедуры и функции.
Пример:
program Scope;
var a0 :integer;
procedure p1;
var a1 :integer;
procedure p2;
var a2, b2 :integer;
begin
... {доступны: a0,a1 –глобальные}
... {a2,b2 - локальные}
end;
var b1 :integer;
begin
... {доступны: a0 –глобальная}
... {a1,b1 – локальные}
end;
var b0 :integer;
begin
... {доступны только a0,b0}
end.
В случае совпадения имен локального и глобального идентификаторов, видимым будет только локальный идентификатор, а глобальный недоступен. То есть действие внешних идентификаторов отменяется. Действуют только локальные идентификаторы с тем же именем, независимо от того, совпадают они по типу, или нет.
Пример:
program EqualNames;
var a :integer;
procedure p1;
var a :real;
procedure p2;
var a :char;
begin
... {a доступна как char}
end;
begin
... {a доступна как real}
end;
begin
... {a доступна как integer}
end.
Локальные данные создаются при вызове подпрограммы, а существуют только во время ее выполнения. Выделение памяти для локальных данных происходит в начале выполнения подпрограммы, а освобождение этой памяти
– как только выполнение подпрограммы заканчивается. После завершения подпрограммы все изменения значений локальных данных, сделанные в ходе ее работы, исчезнут вместе с освобождением памяти.