В Паскале существует 4 вида параметров: значение, константа, переменная и нетипизованное значение. Они характеризуются следующим:
1. Группа параметров без предшествующего ключевого слова и завершенная указанием типа является списком параметров-значений.
2. Группа параметров, предваренных словом const и завершенная определением типа, является списком параметров-констант.
3. Группа параметров, предваренная словом var и завершенная указанием типа, является списком параметров-переменных.
4. Группа параметров, предваренная словами var или CONST и не имеющая указания на тип, является списком нетипизованных значений.
Если значения формальных параметров 1-й группы будут изменены в подпрограмме, то новые значения не будут переданы обратно вызывающей программе.
Параметры-константы доступны только для чтения.
Если в подпрограмме будет изменен параметр, описанный с ключевым словом VAR, то его значение изменится и там, откуда была вызвана подпрограмма.
Когда компилятор обрабатывает вызов подпрограмм, то для параметров-значений он резервирует область памяти (в стеке) соответственно типу переданных параметров и записывает туда значения переданных переменных.
В остальных случаях запоминаются не значения, а адреса переданных параметров.
Ниже приводится вариант программы РF, в котором используется процедура для получения двух значений и функция для вычисления отношения:
program РF;
var A,B: integer;
Ratio : real;
procedure GetData(var X,Y : integer);
begin
Write('Введите два числа: ');
Readln(X,Y);
end;
function GetRatio(I,J : integer) : real;
begin
GetRatio := I/J;
end;
begin
GetData(A,B);
Ratio := GetRatio(A,B);
Writeln('Отношение равно ',Ratio);
Readln;
end.
Эта программа иллюстрирует использование процедур и функций.
При компиляции и запуске программы первым в теле программы выполняется оператор GetData(A, В). Этот тип оператора называется вызовом процедуры. При обработке этого вызова программа выполняет операторы в GetData, заменяя Х и Y (формальные параметры) на A и В (фактические параметры). Ключевое слово var перед Х и Y в операторе вызова процедуры GetData указывает, что фактические параметры должны быть переменными, и что значения переменных могут быть изменены и переданы обратно вызывающей программе. Поэтому процедуре GetData нельзя передавать литералы, константы, выражения и так далее. При завершении выполнения GetData управление передается в основное тело программы оператору, следующему за вызовом GetData.
Этим следующим оператором является вызов функции GetRatio. Отметим здесь некоторые важные отличия. Во-первых, GetRatio возвращает значение, которое затем должно быть где-нибудь использовано. В данном случае это значение присваивается Ratio. Во-вторых, в основном теле функции значение присваивается GetRatio. Таким образом функция определяет, какое значение следует возвратить. В-третьих, перед формальными параметрами I и J здесь отсутствует ключевое слово var. Это означает, что фактические параметры могут быть любыми целочисленными выражениями, например, Ratio := GetRatio(A+В, 300), и что даже если значения формальных параметров в теле функции будут изменены, новые значения не будут переданы обратно вызывающей программе. Это, кстати, не является различием между процедурами и функциями. Вы можете использовать оба типа параметров с любым видом подпрограммы [8,9].
Вопросы:
1. Какие типы параметров могут передаваться в подпрограммы?