Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
паскаль.doc
Скачиваний:
7
Добавлен:
25.09.2019
Размер:
222.21 Кб
Скачать

4. Механизм передачи параметров

В заголовке подпрограммы может быть задан список формальных параметров. Каждый параметр, заданный в заголовке, считается локальным в данной подпрограмме. Идентификаторы формальных параметров можно считать условными обозначениями реальных (фактических) параметров, которые будут переданы в подпрограмму при её вызове.

Внимание: Типы формальных параметров должны обязательно обозначаться идентификаторами.

Недопустимо: Procedure InCorrect (Var A: Array [1..10] of Byte); Нужно: Type MyArray = Array [1..10] of Byte; Procedure Correct (Var A: MyArray);

Допустимы по крайней мере три способа задания формальных параметров:

  1. параметры, перед которыми отсутствует служебное слово Var и за которыми следует идентификатор типа;

  2. параметр, перед которым Var и далее тип;

  3. параметр со словом Var и не имеющие типа.

Эти три способа задания формальных параметров отражают три различных способа передачи параметров a - по значению; b - по ссылке; c - передача нетипизированных параметров по ссылке (b, c - параметры-переменные).

Параметры - значения. Наиболее распространенный и простой способ. Параметр - обычная локальная переменная. Может использовать выражение. Любые действия внутри подпрограммы никак не отражаются на значениях переменной вне подпрограммы.

Параметры - переменные. Передаются по ссылке. Способ используется, когда необходимо передать некоторое значение в точку вызова подпрограммы. В случае Var - формальные параметры считаются синонимами соответствующих фактических параметров. При этом фактические параметры должны быть переменными (не выражениями) того же типа, что и формальные параметры:

Procedure Swap (Var X,Y: Real); Var   T: Real; Begin   T:= X;   X:= Y;   Y:= T; End;

Переменные файловых типов могут передаваться в подпрограмму только как параметры - переменные.

Безтиповые параметры. Var Ident, где Ident - идентификатор формального параметра. Фактический параметр, соответствующий формальному нетипизированному, должен представлять собой переменную любого типа (но не выражение). Единственным способом использования таких параметров является “наделение” их определённым типом.

Применить операцию приведения типа. Описать в подпрограмме локальную переменную определённого типа с совмещением её в памяти с нетипизированным параметром.

Пример1: функция для сравнения значений двух переменных любых типов и, соответственно, любых размеров: Function Equal (Var Source, Dest; Size: Word): Boolean; Type   Bytes = Array [0..MaxInt] of Byte; Var   N: Integer; Begin   N:= 0;   While (N < Size) and (Bytes(Dest)[N] - Bytes(Source)[N]) do     N:=N+1;   Equal:= (N = Size); End;

{Имеются описания:}

Type   Vector = Array [1..10] of Integer;   Point = Record    X,Y: Integer;   End; Var   Vec1, Vec2: Vector;   N: Integer;   P: Pointer; Begin   . . . . . . . . . . . . . . . . . . . . . . . . .   Equal(Vec1, Vec2, SizeOf(Vector)); {сравниваются все элементы Vec1 c Vec2}   Equal(Vec1, Vec2, SizeOf(Integer)*N); {сравниваются N первых элементов Vec1 и Vec2}   Equal(Vec1[1], Vec2[6], SizeOf(Integer)*5); {сравниваются 5 первых элементов Vec1 c пятью последними Vec2}   Equal(Vec1[1], P, 4); {сравнивает Vec1[1] c P.x и Vec2 с P.y}

Пример2: задание различных действий в зависимости от размера переданного нетипизированного параметра: Procedure Size (Var X); Var   V1: Byte absolute X;   V2: Word absolute X;   V3: LongInt absolute X; Begin   Case SizeOf(X) of     SizeOf(Byte):     Begin     . . V1 . .     End;     SizeOf(Word):     Begin     . . V2 . .     End;     SizeOf(LongInt):     Begin     . . V3 . .     End;   End; End;

Вычисление значения функции, завершение подпрограммы. Смысл функции заключается в задании алгоритма вычисления некоторого значения и организации возврата этого значения в точку вызова.

В теле функции должен присутствовать оператор присваивания специального вида, в левой части которого должен быть указан идентификатор, совпадающий с именем функции, а в правой части - выражение, вычисляющее возвращаемое значение. Таких операторов может быть несколько, важно чтобы хотя бы один всегда срабатывал в процессе выполнения тела функции. Если в процессе выполнения функции не было выполнено ни одного присваивания, то результат функции считается неопределённым. Функция может возвращать в качестве результата значения только простого, строкового или ссылочного типа.

Работа процедуры или функции по определению завершится после выполнения последнего оператора её тела. Однако Турбо-Паскаль имеет оператор Exit, возвращающий программу в точку вызова. Перед выполнением Exit в теле функции должен выполнится оператор присваивания имени функции значения.