ТОП 10:

Список формальных параметров



Параметры, описанные в заголовке подпрограммы, называются формальными.

Примеры:

(value: integer) (X, Y: Real) (st:string; n:integer; c,fill:char)

Список формальных параметров – это последовательность объявлений однотипных параметров. Объявления отделяются друг от друга точкой с запятой. Каждое объявление состоит из списка имен параметров, символа ‘:’ и указания их типа. Внутри объявления имена параметров разделяются запятой. Имя параметра – это корректный идентификатор.

Существует два способа передачи параметра в подпрограмму: по значению(параметры-значения) или по ссылке. Для передачи параметра по ссылке рядом с именем параметра используется одно из зарезервированных слов: var (параметры-переменные), const (параметры-константы), out (выходные параметры). Например:

(var S: string; X: Integer)(const P; I: Integer)

Чтобы почувствовать разницу в способах передачи параметров, обратимся к следующим примерам (из Help):

function DoubleByValue(X: Integer): Integer; // X is a value parameter begin X := X * 2; Result := X; end;   function DoubleByRef(var X: Integer): Integer; // X is a variable parameter begin X := X * 2; Result := X; end;

Эти функции возвращают одинаковый результат, но только вторая может изменять значение параметра, переданного в подпрограмму. Вызовем эти функции:

Var I, J, V, W: Integer; begin I := 4; V := 4; J := DoubleByValue(I); // J = 8, I = 4 W := DoubleByRef(V); // W = 8, V = 8 end;

Параметры-значения можно рассматривать как локальные переменные, которые получили начальное значение при вызове подпрограммы. Если вы передали какую-нибудь переменную как параметр-значение, то подпрограмма создает копию переменной. Изменения этой копии не приводят к изменению исходной переменной и утериваются после завершения работы подпрограммы.

Параметры-переменные похожи скорее на указатели. Изменения такого параметра внутри тела процедуры или функции сохраняются после завершения работы подпрограммы и возвращаются в вызывающую программу.

(схемка)

Назначение зарезервированных слов:

Ключевое слово  
Var Можно использовать для передачи данных в подпрограмму и для получения данных из подпрограммы
Const Нельзя изменять значение в теле подпрограммы. Похож на локальную переменную только для чтения.
Out Нельзя использовать для передачи данных в подпрограмму. Используется только для получения данных из подпрограммы.

Для параметров-значений и параметров-констант возможно указание в заголовке процедуры или функции значения по умолчанию. Для этого в объявлении параметра после типа используется ‘=’ и указывается само значение (константное выражение совместимого типа). Например:

(var S: string; X: Integer = 5)(const P, I: Integer; const M: real = 4.5)

Для параметров, передающихся по ссылке, можно не указывать тип параметра. Такие параметры называются нетипизированными. Параметр-значение обязательно типизирован. Примеры:

(var S, X; out Z)(const P, I; var M)

Внутри подпрограммы непизированные параметры несовместимы ни с какими типами. Необходимо выполнить приведение типов.

Локальные объявления

Тело процедуры или функции часто начинают с объявления локальных переменных, которые используются внутри подпрограммы. Эти объявления могут также включать константы, типы, другие подпрограммы. Область видимости локальных идентификаторов ограничена подпрограммой, где они объявлены.

Процедуры и функции иногда содержат в секции локальных объявлений другие функции и процедуры, так называемые вложенные. Например:

procedure DeleteRandomSymbol(var S: string);   function RandomNumber(S: string):integer; var LenString: Integer; Begin LenString:=Length(s); Result:= Random(LenString) + 1; end;   begin Delete(S, RandomNumber(s), 1); end;

Область видимости вложенных подпрограмм ограничена подпрограммой, внутри которой они объявлены. В примере функцию RandomNumber можно вызывать только внутри процедуры DeleteRandomSymbol.

Тип возвращаемого значения

Понятие возвращаемого значения имеет смысл только тогда, когда мы говорим о функции, так как процедура не возвращает значения. Функции возвращают значения любых типов данных кроме Text и file of.

Важные тезисы:

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

function Power(X, Y: Double): Double; // X и Y - формальные параметрыbeginPower := Exp(Y * Ln(X));end; function Power(X, Y: Double): Double; // X и Y - формальные параметрыbeginResult := Exp(Y * Ln(X));end; function Min(const A, B: Integer): Integer;beginif A < B then Result := A else Result := B;end;

Если таких присваиваний несколько, то результатом функции будет значение последнего из этих операторов.

Преимущество от использования переменной Result состоит в том, что она может участвовать в выражениях как операнд внутри тела функции.

Переменная Result и имя функции всегда представляют одно и то же значение.

Пример:

function MyFunction: Integer;beginMyFunction := 5;Result := Result * 2;MyFunction := Result + 1;end;

(Можно задать вопрос, какое значение вернет функция)

Эта функция вернет значение 11.

Использование имени функции в правой части оператора присваивания приведет к рекурсивному вызову этой функции в отличие от переменной Result

Вызов процедур и функций

Параметры, которые передаются в подпрограмму при ее вызове, называются фактическими.

Вызов процедуры для выполнения осуществляется по ее имени, за которым в круглых скобках следует список фактических параметров, т.е. передаваемых в процедуру данных:

<имя процедуры> ( <список фактических параметров> );

Рассмотрим пример.

Var A, G: Double; procedure Average(const X, Y: Double; out M, P: Double);begin M := (X + Y) / 2; P := Sqrt(X * Y);end; procedure TForm1.Button1Click(Sender:Tobject);begin Average(10, 20, A, G); ShowMessage('Среднее арифметическое = ', FloatToStr(A)); ShowMessage('Среднее геометрическое = ', FloatToStr(G));End; end.

При вызове подпрограмм необходимо помнить следующее:

1. Выражения, используемые для передачи в типизированные параметры-константы и в параметры-значения должны быть совместимыми по присваиванию с соответствующими формальными параметрами.

2. Выражения, используемые для передачи в параметры-переменные и в выходные параметры должны быть одинаковых с соответствующими формальными параметрами типов, исключая непизированные параметры.

3. На место параметров, передаваемых по ссылке можно подставлять только переменные, нельзя – числа и константы.

4. Если список формальных параметров отсутствует, то список фактических параметров (в том числе круглые скобки) не указывается.

5. Если вызывается подпрограмма с параметрами по умолчанию, то все фактические параметры по умолчанию, идущие перед тем параметром, который необходимо передать значение, отличное от умолчания, должны быть заполнены. Например, SomeFunction(,,X) – некорректен

Различные способы передачи параметров в подпрограмму. Передача параметров-массивов в подпрограмму. Передача параметров, значения которых заданы по умолчанию. Примеры.







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

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