Например, если описана процедура
procedure Mult2(var a: integer);
begin
a := a*2;
;
то после вызова Mult2(d) значение d увеличится в 2 раза.В качестве фактического параметра-значения можно указывать любое выражение, тип которого совпадает с типом формального параметра или неявно к нему приводится. В качестве фактического параметра-переменной можно указывать только переменную, тип которой в точности совпадает с типом формального параметра.
При передаче параметра по ссылке в подпрограмму передается адрес фактического параметра. Поэтому если параметр занимает много памяти (массив, запись, строка), то обычно он также передается по ссылке. В результате в процедуру передается не сам параметр, а его адрес, что экономит память и время работы. При этом если параметр меняется внутри подпрограммы, то он передается с ключевым словом var, если не меняется - с ключевым словом const:
Например:
type
Person = record
name: string;
age,height,weight: integer;
end;procedure Print(const p: Person);
begin
write(p.name,' ',p.age,' ',p.height,' ',p.weight);
end;
procedure IncAge(var p: Person);
begin
Inc(p.age);
end;
Отметим особенности передачи динамических массивов в качестве параметров подпрограмм.
Поскольку динамический массив является ссылкой, то при изменении формального параметра-динамического массива внутри подпрограммы меняется соответствующий фактический параметр. Например, в результате работы программы
procedure p(a: arrayof integer);
begin
a[1] := 2;
end;
var b: arrayof integer := (1,1);
begin
p(b);
writeln(b[1]);
end.
будет выведено 2. Передавать динамические массивы по ссылке имеет смысл только в случае если память под динамический массив перераспределяется внутри подпрограммы:
procedure q(var a: arrayof integer);
begin
SetLength(a,10);
end;
Переменное число параметров
Для указания того, что подпрограмма должна иметь переменное число параметров, используется ключевое слово params, за которым следует описание динамического массива. Например:
function Sum(params a: arrayof integer): integer;
begin
Result := 0;
for i: integer := 0 to a.Length do
Inc(Result,a[i]);
При вызове подпрограммы на месте формального параметра params может быть любое ненулевое количество фактических параметров совместимого типа, перечисляемых через запятую:
var s: integer := Sum(1,2,3,4,5);
s := s + Sum(6,7);
В списке параметров ключевое слово params может указываться только для последнего параметра, причем, этот параметр не должен быть параметром по умолчанию. Параметры params всегда передаются только по значению.
Параметры по умолчанию
В заголовке подпрограммы можно использовать параметры по умолчанию. Для этого достаточно после параметра поставить знак присваивания и значение. Если при вызове не указать значение параметра по умолчанию, то будет использовано то значение, которое указано в описании подпрограммы. Параметры по умолчанию должны передаваться по значению и идти последними в списке параметров.
Например:
procedure PrintTwo(a,b: integer; delim: char := ' ');
begin
write(a,delim,b);