Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






В Borland Pascal допускается использовать параметры, тип которых не указан. Такие параметры могут передаваться в подпрограмму только по ссылке, как параметры-переменные, так как в этом случае в подпрограмму реально передается адрес параметра.

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

Для приведения нетипизированного параметра к определенному типу можно использовать:

§ автоопределенное преобразование типов;

§ наложенное описание переменной определенного типа.

При автоопределенном преобразовании типов тип выражения указывают явно, например:

Procedure Proc(Var: a);

......

b: = Integer (a)+10;...

Для наложения переменной определенного типа используют описание с absolute, например:

Procedure Proc(Var: a);

...

Var

r: real absolute a;...

При этом переменная r оказывается в памяти размещенной в том же месте, что и нетипизированный параметр а, и, соответственно, любое изменение r приведет к изменению а.

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

Тип массива подпрограмма будет определять по значению третьего параметра, для которого объявим специальный перечисляемый тип. В разделе описаний подпрограммы определим шаблоны для каждого случая. Шаблон представляет собой описание массива соответствующего типа максимально возможного размера 64 Кб/< размер элемента>. Оба шаблона наложены по адресу нетипизированного параметра. Если значение третьего параметра подпрограммы treal, то используется шаблон mr, а если tinteger - шаблон mi.

Unit Summa4;

Interface

Type ttype=(treal, tinteger); {описание типа третьего параметра}

Function sum(var x; n: integer; t: ttype): real;

Implementation

Function sum;

Var mr: array[l..maxint*2 div sizeof(real)] of real absolute x;

mi: array[L.maxint*2 div sizeof(integer)J of integer absolute x;

s: real;

i: integer;

begin

s: =0;

if t=treal then

for i: =l to n do s: =s+mr[i] else

for i: -l to n do s: =s+mi[ij;

sum: =s;

end;

End.

Тестирующая программа вызывает одну и ту же функцию для суммирования массивов с разным типом элементов.

Program ex;

Uses Summa4;

 

Var a: array [1..10] of integer;

b: array[1..15] of real;

i, n: integer;

Begin

for i: =l to 10 do Read(a[i]);

ReadLn;

WriteLn('Cyммa= ', sum (a, 10, tinteger): 8: l);

for i: =l to 15 do Read(b[i]);

ReadLn;

WriteLn('Cyммa= ', sum (b, 15, treal): 8: l);

end.

Вместо описания массива максимально возможного размера в подпрограмме можно описать массив длиной 1 элемент, но при работе с таким шаблоном необходимо отключать контроль индексов {$R-}.

Нетипизированные параметры можно применить для написания универсальных подпрограмм, использующих в качестве параметров многомерные массивы. Поскольку невозможно в подпрограмме определить универсальный шаблон многомерного массива, приходится обрабатывать многомерный массив как одномерный, учитывая то, что элементы многомерных массивов в памяти располагаются так, что чем правее индекс, тем быстрее он возрастает. Так элементы трехмерного массива В(2, 3, 2) будут расположены в памяти в следующем порядке:

b1, 1, 1, b1, 1, 2, b1, 2, 1, b1, 2, 2, b1, 3, 1, b1, 3,, 2, b2, 1, 1, b2, 1, 2, b2, 2, 1, b2, 2, 2, b2, 3, 1, b2, 3, 2.

Пример 2. Разработать универсальную подпрограмму транспонирования матрицы.

В одномерном массиве элемент с индексами i и j имеет индекс (i-l)*P+j, т.е. индекс этого элемента зависит от размера строки зарезервированной матрицы. В подпрограмму это значение передается через параметр Р.

Чтобы транспонировать матрицу, меняем местами элементы, расположенные ниже и выше главной диагонали.

При разработке алгоритма процедуры учтено, что при транспонировании матрицы по аналогии с переворотом строки количество перестановок равно n*n div 2. Если выполнить n*n перестановок, то матрица примет исходный вид, так как будет транспонирована дважды.

Unit Matrica;

Interface

Procedure tran(Var x; n, P: integer);

Implementation

Procedure Iran;

Var a: array[1..2*maxint div sizeof(real)] of real absolute x;

i, j: integer;

t: real;

begin

for i: =2 to n do

for j: =l to i-1 do

begin

t: =a[(i-l)*P+j];

a [(i-l) *P+j]. =a [j-l) *P+i],

a[(J-l)*P+i]: = t;

end;

end;

End.

Тестирующая программа выглядит следующим образом:

Program ex;

Uses Matrica;

Var a: array [1..10, 1..10] of real;

i, j: integer;

Begin

WriteLn(‘Введите матрицу a(5*5): ');

for i: =l to 5 do

begin

forj: =l to 5 do Read(afiJJ);

ReadLn;

end;

tran(a, 5, 10); •

WriteLn('Результат: ');

for i: =I to 5 do

begin

forj: =l to 5 do Write(a[ij]: 6: 2);

WriteLn;

end;

End.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.