Несмотря на всю привлекательность последней версии функции поиска максимума, предыдущие варианты сбрасывать со счетов не стоит. Во-первых, открытые массивы могут быть только одномерными. Во-вторых, их элементы передаются через стек, что замедляет работу программы и может послужить причиной переполнения стека.
Распространим некоторые идеи передачи параметров на двумерные массивы в задаче суммирования квадратных матриц. Первый пример использует нетипизированные переменные:
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) {