Открытые параметры-массивы и особенности работы с ними

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

const Max = 63; type TStatistics = array [0..Max] of Double; function Average(const A: TStatistics): Double; var I: Integer; begin Result := 0; for I := Low(A) to High(A) do Result := Result + A[I]; Result := Result / (High(A) - Low(A) + 1); end;

Функция Average принимает в качестве параметра массив известной размерности. Требование фиксированного размера для массива-параметра часто является чрезмерно сдерживающим фактором. Процедура для нахождения среднего значения должна быть способна работать с массивами произвольной длины. Для этой цели в язык Delphi введены открытые массивы-параметры.

1. Открытый массив-параметр описывается с помощью словосочетания array of, при этом границы массива опускаются:

2. Внутри подпрограммы Average нижняя граница открытого массива A равна нулю (Low(A) = 0), а вот значение верхней границы (High(A)) неизвестно и выясняется только на этапе выполнения программы.

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

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

5. Открытые массивы могут быть переданы в подпрограммы только по значению или как параметры-константы.

6. Некоторые библиотечные подпрограммы языка Delphi принимают параметры типа array of const — открытые массивы констант. Массив, передаваемый в качестве такого параметра, обязательно конструируется в момент вызова подпрограммы и может состоять из элементов различных типов (!). Физически он состоит из записей типаTVarRec, кодирующих тип и значение элементов массива (записи рассматриваются ниже). Открытый массив констант позволяет эмулировать подпрограммы с переменным количеством разнотипных параметров и используется, например, в функции Format для форматирования строки.

Бестиповые параметры и особенности работы с ними

В Турбо Паскале существует возможность создания процедур и функций с параметрами, не имеющими типа. Бестиповые параметры могут быть параметрами–переменными и параметрами–константами, так как передаются только по адресу. Заголовок процедуры с параметрами, не имеющими типа, может выглядеть таким образом:

procedure myproc(var par1, par2; const par3, par4);

Процедурный тип, определение, область применения

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

type

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

Proc2 = Procedure (var a, b);

РrосЗ = Procedure;

Func1 = Function: String;

Func2 = Function (var s: String): real;

Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция.

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

Явная и неявная рекурсия

Прямая или явная рекурсия характеризуется существованием в теле процедуры оператора обращения к самой себе.

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

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

сначала задаются прототипы подпрограмм с параметрами, за которыми вместо тела подпрограммы следует forword;

затем описываются тела этих подпрограмм (причем параметры второй раз можно уже не описывать).

Типизированные константы

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

В Паскале типизированные константы задаются в разделе объявления констант следующим образом:

<идентификатор> : <тип> = <значение> ;

Здесь <идентификатор> – идентификатор константы;

<тип> – тип константы;

<значение> – значение константы.

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

II. Файлы

Наши рекомендации