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

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

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

Пример.ПросуммироватьNэлементов одномерных числовых массивов произвольной размерности.

. . .

Var

{ фактические параметры - }

Ar_Byte1: array[1..200] of byte;

{ интерпретируемые }

Ar_Byte2: array[1..2000] of byte;

{ области }

Ar_Int: array[1..500] of integer;

{ памяти }

Function Sum( var X; n: word ): longint;

{ X – параметр без типа, n – размерность массива }

Type

Xtype =array[0..65520] of byte;

{Маска – одномерный массив типа Byte }

Var

summa: longint; i: word;

begin

summa:=0;

for i:=1 to n do

{ XType( X )[i] – автоопределенное преобразование элемента массива-

параметра X к типу элемента массива-маски Byte }

summa:=summa + XType( X )[i];

{ интерпретация элементов массива X через маску }

Sum:=summa;

end;

begin

. . .

writeln( Sum( Ar_Byte1, 200 ) );

writeln( Sum( Ar_Int, 500 ) );

writeln( Sum( Ar_Byte2, 2000 ) );

. . .

В качестве первого параметра функции Sum можно использовать массив любого типа и любой размерности. В теле функции выполняется автоопределенное преобразование элемента массива-параметра X к типу элемента массива-маскиByte. Если бы в теле функции была определена маска другого типа, например,Word, преобразование выполнялось бы к этому типу.

5.2.4. Открытые массивы

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

. . .

var

{ фактические параметры - }

Ar1: array[1..100] of integer;

{ интерпретируемые }

Ar2: array[1..1000] of integer;

{ области памяти }

s: integer;

Procedure Sum( var X: array of integer;

{ X окрытый массив, его тип – }

var summa: integer );

{ маска }

Var i: word;

begin

summa:=0;

for i:=0 to high( X ) do

{ интерпретация элементов массива }

summa:=summa + X[i];

{ через маску }

end

begin

. . .

Sum( Ar1,s ); writeln( s );

Sum( Ar2,s ); writeln( s );

. . .

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