Практика программирования (Бейсик, Си, Паскаль)




Массивы в качестве параметров процедур и функций - часть 3


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

function Max(var a; n:integer):integer;

var

c:array[l.. Maxlnt] of integer absolute a;

m,k:integer;

begin

m:=c[l];

for k:=2 to n do

if m<c[k] then m:=c[k];

Max:=m;

end;

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

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

function Max(pa:pointer; n:integer):integer;

var

m,k:integer;

pb:^integer;

begin

pb:=ptr(зед(ра^) , ofs(ра^) ) ;

m:=рb^;

for k:=2 to n do

begin

pb:=ptr(seg(ра^),ofs(ра^)+k*2);

if m < рb^ then m:=рb^;

end;

Max:=m;

end;

Для вызова такой функции при определении максимального элемента в массиве q необходимо задавать адрес аргумента:

max_q:=Max(&q,100);

Этот пример демонстрирует работу с адресами и указателями в Паскале. В нем использована функция ptr, вычисляющая адрес элемента данных по сегменту (seg) и смещению (ofs). Адрес сегмента, задающий начало массива, у локачьного указателя ь совпадает с адресом массива a (seg(pb^)=seg(pa^)), а смещение очередного элемента вычисляется в цикле путем прибавления к смещению начального элемента ofs (ра^) приращения 2*k.

Наверное, все эти три подхода блекнут перед новинкой в лице открытых массивов, появившихся в последних версиях Паскаля. В качестве открытого массива может выступать любой одномерный массив, индексы в котором отсчитываются от 0. Признаком открытого массива является его описание в укороченном виде — без задания индексных границ:

function Max(a:array of integer):integer;

var

m,k:integer;

begin

m:=a[0];

for k:=l to High(a) do

if m < a[k] then m:=a[k];

Max:=m; end;

Для открытых массивов появилась системная функция High, позволяющая узнать максимальный индекс. При использовании открытых массивов вы должны включить соответствующее указание компилятору — {$P+}.




Содержание  Назад  Вперед