Каждый параметр, объявленный в списке формальных параметров, является локальным по отношению к данному блоку, т.е. не видим за его пределами. Это означает, в частности, что в списке формальных параметров можно использовать переменные с такими же именами, как в основной программе или других процедурах и функциях. Данное правило верно и для локальных, т.е. объявленных внутри процедуры или функции, переменных.
Например:
var a: byte; {определяем глобальную переменную с именем A}
procedure One(a:byte); {определяем процедуру One с аргументом A}
var b:byte; {определяем локальную переменную B процедуры One}
procedure Two;
var a:byte; {определяем локальную переменную A процедуры Two}
begin
…
a:=89;{значение присваивается локальной переменной A процедуры Two}
b:=a; {значение локальной переменной A процедуры Two присваивается локальной переменной B процедуры One }
…
end; {процедура Two завершена …}
begin {… начинается процедура One }
…
a:=98;{значение присваивается переменной A из процедуры One}
…
end; {процедура One завершена …}
begin {… начинается основная программа }
…
a:=0; {значение присваивается глобальной переменной A}
…
end.
Существует 3 вида формальных параметров: Параметр-значение, Параметр-переменная, Параметр-нетипированная переменная.
1) Параметр-значение - без "var" или "const", но с типом параметра.
Параметр-значение является полностью локальным, за исключением того, что принимает начальное значение от фактического параметра, переданного в процедуру или функцию. Любое изменение параметра-значения внутри составного оператора процедуры или функции не влияет на значение фактического параметра. С помощью параметра-значения можно передавать информацию в процедуру или функцию, но не обратно.
Фактический параметр, соответствующий параметру-значению в операторе процедуре или вызове функции может быть выражением любого типа, совместимого по присваиванию с типом формального параметра.
Например:
В результате работы программы на экране появится число 8.
2) Параметр-переменная - с "var" или "const", и с типом параметра. Компилятор запрещает изменять параметр, предваряемый зарезервированным словом const.
Параметр-переменная используется как для передачи информации в процедуру или функцию, так и обратно. Любое изменение формального параметра-переменной сказывается и на фактическом параметре.
Фактический параметр, соответствующий формальному параметру-переменной, должен быть переменной с типом, тождественным формальному параметру.
Например:
Если заголовок процедуры определен следующим образом:
procedure A(var b:byte);
то компилятор выдаст ошибку при попытке ее вызова с константным значением или выражением в качестве аргумента.
procedure A(var b:byte);
begin
…
end;
var x:integer; y:byte;
begin
…
a(7); a(4+y); a(x); {неверные вызовы!!!}
a; {правильный вызов}
…
end.
Файловые типы могут передаваться только как параметры-переменные.
Параметры-переменные отличаются от параметров-значений методом передачи данных. Если параметр-значение - это копия фактического параметра, то параметр-переменная - это ссылка на фактический параметр, его адрес в памяти компьютера. Из этого вытекает еще одна особенность параметров-переменных: объем памяти, выделяемый для них, неизменен и равен 4 байтам. Таким образом, если в процедуру или функцию требуется передать, например, массив большого размера, то для ускорения работы программы и экономии памяти желательно осуществить его передачу как параметра-переменной. В то же время, если требуется запретить изменение переданного массива, можно вместо зарезервированного слова var воспользоваться словом const.
Например:
procedure X(var A:integer); begin a:=7; end;
var d:integer;
begin {основная программа}
d:=8;
x(d);
writeln(d);
end.
В результате работы программы на экране появится число 7.
3) Параметр-нетипированная переменная - с "var" или "const", и без типа параметра.
Если параметр является нетипированным, то соответствующий фактический параметр может быть переменной любого типа. В этом случае внутри процедуры или функции может потребоваться преобразование типа или использование абсолютных переменных для параметра.