Любой из формальных параметров подпрограммы может быть либо параметром-значением, либо параметром-переменной, либо параметром-константой. Если параметры определяются как параметры-переменные, перед ними необходимо ставить зарезервированное слово VAR, например:
procedure p (var a : real); Здесь параметр а - параметр-переменная.
Заголовок процедуры может быть устроен так, что некоторые группы формальныхпараметров не содержат слова VAR. Например:
procedure p (a,b,c:real; var s:real);
Формальные параметры, которые входят в группы, не содержащие слова VAR,называются формальными параметрами-значениями.
Определение формального параметра тем или иным способом существенно толькодля вызывающей программы: если формальный параметр объявлен как параметр-переменная, то при вызове подпрограммы ему должен соответствовать фактический параметр в виде переменной определенного типа; если формальный параметр объявлен как параметр-значение, то при вызове ему может соответствовать произвольное выражение. Контроль за неукоснительным соблюдением этого правила осуществляет компилятором ТУРБО ПАСКАЛЯ.
Для того чтобы понять, в каких случаях использовать параметры значения, а вкаких - параметры-переменные, рассмотрим, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме.
Если параметр определен как параметр-значение, то перед вызовомподпрограммы это значение вычисляется, полученный результат копируется во временную память и передается подпрограмме. Важно учесть, что даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, все равно подпрограмме будет передана лишь копия переменной (константы). Таким образом, назначение параметра-значения – передача данных из программы в подпрограмму. Если же параметр определен как параметр-переменная, то при вызове подпрограммы передается сама переменная, а не ее копия. Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра, в то время как изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе. Параметр-константа схож с параметром-переменной: в подпрограмму передается сама константа, но изменение её невозможно. Назначение такого параметра совпадает с назначением параметра-значения. Формальные параметры-константы указываются в заголовке программы после служебного слова const. Его действие распространяется до ближайшей точки с запятой.
Поясним изложенное.
Program ...;
…..
var
a, b: integer;
f:boolean;
......
procedure squar(a: integer; var b: integer; const f : boolean);
begin
a:=sqr(a);
b:=sqr(b);
writeln(‘в квадрате они выглядят так: ’,a,’, ’,b);
end;
........
Begin
a:=4; b:=6;
writeln(‘внимательно посмотрите на эти числа:’ ,a, ’,’ ,b, ’,’ ,f);
squar(a,b);
writeln(‘а так, а не в квадрате: ’,a, ’, ’,b);
End.
Результаты выглядят так: внимательно посмотрите на эти числа: 4, 6
в квадрате они выглядят так: 16, 36
а так, а не в квадрате: 4, 36
Переменная логического типа не учувствовала в подпрограмме. Я лишь показал, как объявляются переменные константы, которые нельзя изменять в теле подпрограммы.
Этот пример может служить еще и иллюстрацией механизма «закрывания» глобальной переменной, а одноименной локальной: хотя переменная объявлена как глобальная (она описана в вызывающей программе перед описанием процедуры), в теле процедуры ее «закрыла» локальная переменная а, объявленная как параметр-значение.
Итак, параметры-переменные используются как средство связи алгоритма,реализованного в подпрограмме, с «внешним миром»: с помощью этих параметровподпрограмма может передавать результаты своей работы вызывающей программе.Разумеется, в распоряжении программиста всегда есть и другой способпередачи результатов - через глобальные переменные. Однако злоупотреблениеглобальными связями делает программу, как правило, запутанной, трудной впонимании и сложной в отладке. В соответствии с требованиями хорошего стиляпрограммирования рекомендуется там, где это, возможно, использовать передачурезультатов через фактические параметры-переменные.
С другой стороны, описание всех формальных параметров как параметров-переменных нежелательно по двум причинам.
Во-первых, это исключаетвозможность вызова подпрограммы с фактическими параметрами в видевыражений, что делает программу менее компактной.
Во-вторых, и главных, вподпрограмме возможно случайное использование формального параметра,например, для временного хранения промежуточного результата, т.е. всегдасуществует опасность непреднамеренно «испортить» фактическую переменную.
Вот почему параметры-переменные следует объявлять только те, через которыеподпрограмма в действительности передает результаты вызывающей программе.Чем меньше параметров объявлено параметрами-переменными и чем меньше вподпрограмме используется глобальных переменных, тем меньше опасностьполучения непредусмотренных программистом побочных эффектов, связанных свызовом подпрограммы, тем проще программа в понимании и отладке.