Формальные и фактические параметры Вызов по ссылке и значению
Формальные параметры Указываются в заголовке подпрограммы, могут быть: параметры значения (эти параметры в основной программе подпрограммой не меняются ); параметры - переменные ( эти параметры подпрограмма может изменить в основной программе ); параметры-константы ( используются только в версии 7.0); параметры-процедуры и параметры-функции (т.е. процедурного типа).
Описание формальных параметров Для каждого формального параметра следует указать имя и, как правило, тип. Имена параметров могут быть любыми, в том числе и совпадать с именами объектов программы. Необходимо лишь помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Тип формального параметра может быть практически любым, однако в заголовке подпрограммы нельзя вводить новый тип. function Max( A: array[ ] of real ): real; type tArr =array [ ] of real; function Max ( A: tArr ) : real;
Вызов по ссылке и по значению Через список параметров в подпрограмму передаются исходные данные и возвращается результат. При этом предусмотрено два принципиально отличающихся механизма передачи параметров - по значению и по ссылке. Синтаксически эти два способа отличаются употреблением слова Var перед соответствующей переменной в заголовке подпрограммы. Если это слово имеется, то переменная передается по ссылке, а если нет - по значению.
Вызов переменной по значению При вызове по значению в подпрограмме создаются переменные в соответствии с объявлениями в заголовке подпрограммы. Эти переменные существуют только на время выполнения подпрограммы. Передачу данных по значению можно использовать только для передачи данных в подпрограмму, но не для получения от нее результатов.
Procedure SetDate (Year, Month, Day : Word); SetDate (MyYear, MyMonth, MyDay); где MyYear, MyMonth, MyDay - переменные типа Word, которые описаны в основной программе и должны иметь при обращении к процедуре определенные значения. При вызове процедуры эти значения присваиваются внутренним переменным процедуры Year, Month, Day. SetDate (MyYear+1, MyMonth div 2, MyDay); при вызове процедуры используются арифметические выражения, которые вычисляются при вызове. В подпрограмму поступает результат вычислений. SetDate (1999, 1, 31); где в подпрограмму передаются значения констант.
Вызов переменных по ссылке При вызове по ссылке в подпрограмме память под передаваемые переменные не отводится. Основная программа передает в подпрограмму не значение переменной, а ссылку на место в памяти основной программы, где расположена некоторая переменная. Подпрограмма, производя некоторые действия с этой переменной, в действительности производит действия с переменной основной программы, поэтому после выполнения процедуры изменения, совершенные с переменными основной программы, сохраняются. Этот механизм используется для получения от подпрограммы результатов ее выполнения.
Пример вызова по ссылке Procedure GetDate (Var Year, Month, Day : Word); Она имеет три переменные, передаваемые по ссылке. Если мы аналогично предыдущему случаю, вызовем эту процедуру из основной программы командой: Procedure GetDate (MyYear, MyMonth, MyDay); Процедура разместит свои переменные Year, Month, Day в тех же ячейках памяти, что и переменные основной программы MyYear, MyMonth, MyDay. После завершения подпрограммы эти переменные сохраняют полученные в процедуре значения. Для получения от операционной системы даты используется процедура, имеющая заголовок:
Вызов параметров-констант Объявление параметра-константы в заголовке подпрограмм имеет вид const : Попытка изменить данный параметр в подпрограмме обнаруживается компилятором как ошибка. При вызове из основной программы подпрограммы с таким параметром могут использоваться те же способы, что и при передачи параметров по значению: константа может быть задана в явном виде; может быть указана переменная или выражение совместимого с константой типа. Например, Procedure Primer (Const x : byte);
Примеры Заголовки подпрограмм: procedure Inp ( Max, Min: real ; N: Word ); function Mult (X, Y: integer): real; Вызов подпрограмм: Inp(Abs (Z), - Abs (T), 2 * K); M:=Mult(X + Y, X - Y); MA:=MAX( B, 5 );
Решение задачи (вариант 1) Program Variant1; Var X : real; Procedure writeX; Var x : real; Begin write(x) End; Begin X := Pi; writeX End.
Решение задачи (вариант 2) Program Variant2; Var X : real; Procedure writeX; Begin write(x) End; Begin X := Pi; writeX End.