Читайте также:
|
|
Формальные параметры могут быть трех разновидностей:
Параметры-значения, параметры - переменные, параметры - кон-
станты.
Параметры-значения описываются следующим образом:
имя(a,b:Тип1; c,d,e:Тип2;...)
Для каждого формального параметра – значения транслятор внутри
подпрограммы резервирует дополнительные ячейки памяти в соответствии с
типом параметра. При вызове подпрограммы, происходит пересылка факти-
ческого параметра в эти ячейки памяти, после чего выполняется подпрограм-
ма. При этом значение ячейки, где находился сам фактический параметр, не
изменяется. Этот механизм обеспечивает, как, защищенность фактического
параметра, так и его универсальность, т.е. то, что фактическим параметром
может быть константа, переменная или арифметическое выражение.
Например:
Varx,u,zreal;
Function sqxy(x,y:real):real;
begin
if x<0 then x:=0;
if y<0 then y:=0;
Result:=sqrt(x)+sqrt(y);
end;
begin
...
x:=-0.5;
u:=4;
z:=sqxy(x,u);//вызовфункции
write(‘ x=’,x,‘ u=’,u,‘ z=’,z);
z:=sqxy(sin(u)+x,1.86);
...
end;
Здесь внутри функции (х, у) – формальные параметры, а в программе
(х, и) и (sin(u)+x, 1.86) фактические.
При работе данной программы будет напечатано
x= -0.5 u=4 z=2
хотя внутри подпрограммы будет вычислено х=0.
Недостатком формального параметра-значения является необходимость
дублирования ячеек памяти в вызывающей и в вызываемой программах, что в
случае, например, параметра-массива приводит к неоправданным затратам
памяти.
Параметры – константы описываются следующим образом:
имя(Consta,b:Тип1; Constc,d,e:Тип2;...)
В этом случае фактическимпараметром может быть только имя пере-
менной. При вызове подпрограмм передается адрес ячейки переменной, в ко-
торой находится фактический параметр, и все действия производятся над
этой ячейкой. Поэтому после работы подпрограммы в ячейке фактического
параметра при необходимости будет находиться результат.
Например:
typevek = array[1..10] of integer;
procedure sab(n:byte; cоnsta,b:vek; var s:integer);
Var i:byte;
begin
s:=0;
for i:=1 to n do
s:=s+a[i]*b[i];
end;
...
Varx,y:vek;
sk:integer;
begin
Read(x,y);//вводмассивов
sab(5,x,y,sk);
Write(sk);
end;
В процедуре sab массивы a, b описаны как константы, а переменная s
описана как параметр-переменная. Это позволило для массивов x, y сэконо-
мить память, а через параметр-переменную s вывести результат. Ячейку, вы-
деляемую под параметр n, экономнее переслать саму, чем через её адрес, по-
этому для нее используется параметр-значение.
Дата добавления: 2015-01-30; просмотров: 133 | Поможем написать вашу работу | Нарушение авторских прав |