Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 13--18.doc
Скачиваний:
25
Добавлен:
24.04.2019
Размер:
558.08 Кб
Скачать

Параметры-константы

Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна. В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако, если эта переменная имеет большой размер (массив, запись и т. д.), то копия такого параметра займет большую часть стека и даже может его переполнить. Это же приводит и к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурированного типа, передается своим адресом, но предусматривается защита от его изменения. Использовать параметр-константу можно только в версии 7.0.

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

Пример.

function NewString (const S: string): string;

Тип параметра-значения может быть любым за исключением файлового.

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

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

Пример.

Функция вычисления максимального элемента в массиве. Используем в качестве первого параметра параметр-константу:

function Max(const Mas: tArr; N: Byte): Integer;

var Ma: Integer;

i: Byte;

begin

Ma := Mas[1];

for i := 2 to N do

if Ma < Mas[i] then Ma := Mas[i];

Max := Ma

end;

Параметры без типа

В Turbo Pascal можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.

Пример.

function Equal(var Paraml, Param2; Len: Word): Boolean;

Здесь Paraml, Param2 - параметры-переменные без типа (вместо них можно использовать, например, любые переменные простого типа, типа-массив, типа-запись и т. д.); Len - параметр-значение.

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

Массивы и строки открытого типа

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

Пример. Функция вычисления максимального элемента в массиве.

Рассмотрим вариант подпрограммы, используя в качестве передаваемого параметра массив открытого типа:

function Max (var Mas: array of Integer): Integer;

var Ma: Integer;

i: Byte;

begin

Ma := Mas[0];

for i := 1 to High(Mas) do {цикл до наибольшего индекса}

if Ma < Mast i] then Ma := Mas[i];

Max := Ma

end;

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

Разновидность открытого массива - открытая строка, которая может задаваться либо с помощью стандартного типа OpenString, либо с помощью типа string и использования ключа компилятора {$Р+}, например заголовок процедуры, заполняющей каким-либо символом строку, может иметь вид:

procedure FillChar (var Str: OpenString; Ch: Char); или

{$P+}

procedure FillChar (var Str: string; Ch: Char);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]