Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Вызов по ссылке и по значению

Поиск

Список параметров, задаваемый в заголовке процедуры или функции, обеспечивает связь подпрограммы с вызывающей программой. Через него в подпрограмму передаются исходные данные и возвращается результат. При этом предусмотрено два принципиально отличающихся механизма передачи параметров - по значению и по ссылке. Синтаксически эти два способа отличаются употреблением слова 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);

Она имеет три переменные, передаваемые по ссылке. Если мы аналогично предыдущему случаю, вызовем эту процедуру из основной программы командой

GetDate (MyYear, MyMonth, MyDay);

процедура разместит свои переменные Year, Month, Day в тех же ячейках памяти, что и переменные основной программы MyYear, MyMonth, MyDay. После завершения подпрограммы эти переменные сохраняют полученные в процедуре значения.

В 7 версии Borland Pascal предусмотрен новый механизм передачи в подпрограмму параметров по значению. Этот механизм используется, если значение параметра не должно изменяться - это параметры-константы.

Объявление параметра-константы в заголовке подпрограмм имеет вид

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);


Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 161; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.135.231 (0.007 с.)