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




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


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

Распространим некоторые идеи передачи параметров на двумерные массивы в задаче суммирования квадратных матриц. Первый пример использует нетипизированные переменные:

procedure sum+mat(var a,b,c; n:integer);

var

x:array [0..0] of integer absolute a;

y:array [0..0] of integer absolute b;

z:array [0..0] of integer absolute c;

j,k:integer;

begin {$R-}

for j :=0 to n-1 do

for k:=0 to n-1 do

z[j*n+k]:=x[j*n+k]+y[j*n+k];

{$R+} end;

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

Второй пример использует вариант с указателями:

procedure sum_mat(pa, pb, pc:pointer; n:integer);

var

a,b,с:^integer;

j,k:integer;

begin

for j:=0 to n-1 do

for k:=0 to n-1 do

begin

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

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

c:=ptr(seg(рс^),ofs(рс^)+(j*n+k)*2);

с^:=а^+b^;

end;

end;

Массивы-параметры в функциях Си

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

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

int Max(int *a, int n) {




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