Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Нетипизированные параметры

Когда формальный параметр является нетипизированным парамет-

ром-переменной, то соответствующий фактический параметр может

представлять собой любую ссылку на переменную или константу, не-

зависимо от ее типа. Нетипизированный параметр, описанный с клю-

чевым словом var, может модифицироваться, а нетипизированный па-

раметр, описанный с ключевым словом const, доступен только по

чтению.

В процедуре или функции у нетипизированного параметра-пере-

менной тип отсутствует, то есть он несовместим с переменными всех

типов, пока ему не будет присвоен определенный тип с помощью

присваивания типа переменной.

Приведем пример нетипизированных параметров-переменных:

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 Inc(N);

Equal := N = size;

end;

Эта функция может использоваться для сравнения любых двух

переменных любого размера. Например, с помощью описаний:

type

Vector = array[1..10] of integer;

Point = record

x,y: integer;

end;

var

Vec1, Vec2: Vector;

N: integer;

P: Point;

и вызовов функций:

Equal(Vec1,Vec2,SizeOf(Vector))

Equal(Vec1,Vec2,SizeOf(integer)*N)

Equal(Vec[1],Vec1[6],SizeOf(integer)*5)

Equal(Vec1[1],P,4)

сравнивается Vес1 с Vес2, сравниваются первые N элементов Vес1 с

первыми N элементами Vес2, сравниваются первые 5 элементов Vес1 с

последними пятью элементами Vес2 и сравниваются Vес1[1] с Р.х и

Vес2[2] с P.Y.

Хотя нетипизированные параметры дают вам большую гибкость,

их использование сопряжено с некоторым риском. Компилятор не мо-

жет проверить допустимость операций с нетипизированными перемен-

ными.

Открытые параметры

Открытые параметры позволяют передавать одной и той же про-

цедуре или функции строки и массивы различных размеров.

Открытые строковые параметры

Открытые строковые параметры могут описываться двумя спосо-

бами:

- с помощью идентификатора OpenString;

- с помощью ключевого слова string в состоянии {$P+}.

Идентификатор OpenString описывается в модуле System. Он

обозначает специальный строковый тип, который может использовать-

ся только в описании строковых параметров. В целях обратной сов-

местимости OpenString не является зарезервированным словом и мо-

жет, таким образом, быть переопределен как идентификатор, задан-

ный пользователем.

Когда обратная совместимость значения не имеет, для измене-

ния смысла ключевого слова string можно использовать директиву

компилятора {$P+}. В состоянии {$P+} переменная, описанная с клю-

чевым словом string, является открытым строковым параметром.

Для открытого строкового параметра фактический параметр мо-

жет быть переменной любого строкового типа. В процедуре или функ-

ции атрибут размера (максимальная длина) формального параметра

будет тем же, что у фактического параметра.

Открытые строковые параметры ведут себя также как парамет-

ры-переменные строкового типа, только их нельзя передавать как

обычные переменные другим процедурам или функциям. Однако, их

можно снова передать как открытые строковые параметры.

В следующем примере параметр S процедуры AssignStr - это

открытый строковый параметр:

procedure AssignStr(var S: OpenString;

begin

S := '0123456789ABCDEF';

end;

Так как S - это открытый строковый параметр, AssignStr можно

передавать переменные любого строкового типа:

var

S1: string[10];

S1: string[20];

begin

AssignStr(S1); { S1 := '0123456789' }

AssignStr(S2); { S2 := '0123456789ABCDEF' }

end;

В AssingStr максимальная длина параметра S та же самая, что

у фактического параметра. Таким образом, в первом вызове

AssingStr при присваивании параметра S строка усекается, так как

максимальная длина S1 равна 10.

При применении к открытому строковому параметру стандартная

функция Low возвращает 0, стандартная функция High возвращает

описанную максимальную длину фактического параметра, а функция

SizeOf возвращает размер фактического параметра.

В следующем примере процедура FillString заполняет строку

заданным символом до ее максимальной длины. Обратите внимание на

использование функции High для получения максимальной длины отк-

рытого строкового параметра.

procedure FillStr(var S: OpenString; Ch: Char);

begin

S[0] := Chr(High(S)); { задает длину строки }

FillChar(S[1], High(S), Ch); { устанавливает число

символов }

emd;

Значения и параметры-константы, описанные с использованием

идентификатора OpenString или ключевого слова string в состоянии

{$P+}, не являются открытыми строковыми параметрами. Они ведут

себя также, как если бы были описаны с максимальной длиной стро-

кового типа 255, а функция Hingh для таких параметров всегда

возвращает 255.

Соседние файлы в предмете Программирование на Pascal