X1,x2:real;
L,MM:INTEGER;
SP:BYTE;
D1,D2:WORD;
PROCEDURE SUMMA(X:REAL; N,K:INTEGER);
BEGIN
. . .
END;
PROCEDURE RIS(VAR X:REAL;Y,S:WORD;S2:BYTE);
BEGIN
. . .
END;
Begin {Основная программа}
SUMMA (X1,L,MM);
RIS (X2,D1,D2,SP);
END.
При вызове процедуры формальный параметр-значение получает свое начальное значение путем копирования соответствующего ему фактического параметра во временную память. При изменении формального параметра-значения фактический параметр не меняется. На месте формального параметра-значения при вызове процедуры может стоять также выражение такого же типа:
SUMMA (X1+5.1,L,MM)
Если параметр процедуры определен как параметр-переменная, то при вызове процедуры ей передается сама переменная, а не её копия. Это повышает быстродействие работы процедуры и экономит память. Однако любые изменения этой переменной внутри процедуры приводят к изменению самого фактического параметра в вызывающей программе. Если параметр-переменная используется для передачи в вызывающую программу результатов работы процедуры, то это нормально. В остальных случаях целесообразно использовать параметры-значения и параметры-константы. Параметр-константа описывается в заголовке процедуры аналогично параметру-значению, но перед ним ставится служебное слово CONST. В этом случае копия исходных данных не создается, что позволяет экономить память. Таким способом часто пользуются для передачи в подпрограмму больших массивов данных.
PROCEDURE RIS(CONST X:REAL;Y,S:WORD);
Отсюда можно сделать выводы:
Передачу процедуре исходных данных для расчета следует производить через параметры-значения и параметры-константы.
Обмен данными между вызывающей программой и процедурой и обратно следует производить через параметры-переменные.
Следует иметь в виду, что типом любого формального параметра процедуры может быть только стандартный или ранее объявленный тип. Поэтому, нельзя объявить следующую процедуру
PROCEDURE S(A:ARRAY[1..10] OF REAL)
Чтобы в подпрограмму передать весь массив, следует первоначально описать его тип:
TYPE
AT=ARRAY[1..10] OF REAL;
PROCEDURE S(A:AT);
…
Т.к. строка является своеобразным одномерным массивом, то её передача в подпрограмму осуществляется аналогично:
TYPE
S15=STRING[15];
S20=STRING[20];
PROCEDURE S(A:S15;B:S20);
…
Пример
PROGRAM SUMMA;
CONST
C=5;
TYPE
AT=ARRAY[1..C] OF REAL;
VAR
MAS:AT;
I,nmas:byte;
FUNCTION SUM(CONST A:AT;C:BYTE):REAL;
VAR
S:REAL; K:BYTE;
BEGIN
S:=0;
FOR K:=1 TO C DO S:=S+A[K];
SUM:=S;
END;
BEGIN {основная программа}
FOR I:=1 TO C DO
BEGIN
WRITE (‘введите ‘,I,’-й элемент массива : ’);
READLN (MAS[I]);
END;
WRITELN (‘Сумма элементов массива = ‘,
SUM(MAS,C))
END.
В качестве формального параметра можно использовать массивы открытого типа, без указания их размера. Соответствующий фактический параметр в этом случае может быть одномерным массивом любого размера, состоящим из элементов того же типа, что и элементы открытого массива. Фактический размер массива может быть определен в подпрограмме с помощью функции HIGH, которая вычисляет максимальный индекс открытого массива.
Пример
PROGRAM SUMMA;
CONST
C1=3; C2=5;
TYPE
AT3=ARRAY[1..C1] OF REAL;
AT5=ARRAY[1..C2] OF REAL;
VAR