Параметры процедур и функций

Параметры служат для передачи в процедуры и функции исходных данных и для приёма результатов. В зависимости от назначения они описываются в заголовке подпрограммы тремя основными способами:

Первый способ предполагает указание списка параметров и их типа, например:

Procedure MyProc (a,b,c: Integer; d: Real);

Function MyFunc (a,b,c: Integer; d: Real):Real;

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

Второй способ. Фактические параметры передаются в процедуру или функцию по ссылке. В этом случае перед списком параметров располагается слово var, например:

Procedure MyProc(var a,b,c: Integer; d: Real);

Function MyFunc(var a,b,c: Integer; d: Real):Real;

Когда параметр передается посредством ссылки, фактический параметр является переменной. Формальный параметр обозначает эту фактическую переменную в течение всего времени активизации блока. Параметры, переданные посредством ссылки, называются параметрами-переменными. Если параметр определен как параметр–переменная, то при вызове подпрограммы передается сама переменная, а не её копия (фактически в этом случае подпрограмме передается адрес переменной). Их характерный признак – любое изменение формального параметра означает изменение фактического параметра. В параметры, передаваемые по ссылке, помещаются результаты работы программы.

Третий способ описания основан на использовании параметровконстант, которые задаются с использованием слова const:

Procedure MyProc(const a,b,c: Integer; d: Real);

Function MyFunc(const a,b,c: Integer; d:Real):Real;

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

Возможен смешанный вариант, когда указываются и посылаемые в подпрограмму данные, и возвращаются результаты, например:

Procedure MyProc(a,b,c: Integer; var d: Real);

Function MyFunc(a,b,c:Integer; var d:Real):Real;

 

 

Нетипизированные параметры–переменные. Существует разновидность ссылочных параметров без типа. Они называются нетипизированными и предназначены для передачи и приёма данных любого типа. Параметр считается нетипизированным, если тип формального параметра–переменной в заголовке подпрограммы не указан, при этом соответствующий ему фактический параметр может быть переменной любого типа. Нетипизированными могут быть только параметры–переменные.

Нетипизированные параметры описываются с помощью ключевых слов var и const, при этом тип данных опускается:

Procedure MyProc(const y; var x);

Function MyFunc(const y; var x):Real;

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

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

Пример:

Type

MasType=array [1..10] of Integer;

Procedure S (mas:MasType);

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

Procedure MyProc(OpenArray:array of Integer);

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

Пример. Программа вывода на экран содержимого двух одномерных массивов различной длины.

Program DemoMass;

Const

A: array[-1..2] of Integer=(0,1,2,3);

B: array[5..7] of Integer=(4,5,6);

{Процедура обработки открытого массива}

Procedure ArrayPrint(Mas:array of Integer);

Var

i:Integer;

Begin

For i:=0 to High(Mas) do

Write(Mas[i]:8);

Writeln;

End;

Begin {основная программа}

ArrayPrint(A);

ArrayPrint(B);

End.

Параметры–строки. Поскольку строка фиксированной длины является фактически своеобразным массивом, её передача в подпрограмму осуществляется аналогичным образом:

Пример:

Type

InType=String[15];

OutType=String[30];

Function St (s:InType):OutType;

Для передачи строк произвольной длины можно установить режим компиляции, при котором отключается контроль за совпадением длины фактического и формального параметра–строки. При передаче строки меньшего размера формальный параметр будет иметь ту же длину, что и параметр обращения; передача строки большего размера приведет к её усечению до максимального размера формального параметра. Контроль включается только при передаче строки, объявленной как формальный параметр–переменная. Если соответствующий параметр объявлен параметром–значением, эта опция игнорируется и длина не контролируется.

Процедурные типы. Параметры–функции и параметры–процедуры. Процедурные типы позволяют передавать имена процедур и функций в подпрограммы в качестве параметров. Для объявления процедурного типа используется заголовок процедуры (функции), в котором отсутствует ее имя:

Type

Proc1=Procedure (a,b,c:Real; var d:Real);

Proc2=Procedure;

Func1=Function (var a:Integer):real;

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

Пример. Вычислить значения функций: f1=sin(x)+sin(2x);

f2=cos(x)+cos(2x).

Program DemoProc;

Type

Func=Function (x:Real):Real;

Function sin1(x:Real):Real; far;

Begin

Sin1:=sin(x);

End;

Function cos1(x:Real):Real; far;

Begin

Cos1:=cos(x);

End;

Procedure Fn(x:Real; f:Func);

Var

p:Real;

Begin

p:=f(x)+f(2*x);

Writeln ('Значение функции =',p:8:3);

End;

Begin {основная программа}

Clrscr;

Fn(3,sin1);

Fn(5,cos1);

End.

В программе могут быть объявлены переменные процедурных типов:

Var

P1:Proc1;

F1:Func1;

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

Program DemoProc1;

Type

Func=Function (x:Real):Real;

Var

F1:Func;

Function sin1(x:Real):Real; far;

Begin

Sin1:=sin(x);

End;

Procedure Fn(x:Real; f:Func);

Var

p:Real;

Begin

p:=f(x)+f(2*x);

Writeln ('Значение функции =',p:8:3);

End;

Begin {основная программа}

Clrscr;

F1:=Sin1;

Fn(3,F1);

End.

 








Дата добавления: 2015-04-15; просмотров: 965;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.022 сек.