Немного сложнее приходится поступать в программах на Си и Паскале, особенно если речь идет о передаче в качестве параметров двумерных массивов переменного размера.
Массивы-параметры в процедурах и функциях Паскаля
Первое ограничение, с которым сталкиваются программисты в Паскале, звучит следующим образом — если формальным параметром является массив, то его нельзя описать явным образом. Например, ошибочным является заголовок:
function Max(a:array [1..100] of integer):integer;
Правильным считается предварительное объявление типа в головной программе и его использование в заголовке функции:
type
mas100=array [1..100] of integer;
function Max(a:mas100):integer;
Однако такая функция обрекает нас на определение максимального элемента только в массиве типа masioo. А если в нашей программе понадобится обрабатывать массивы и с другим количеством элементов? Конечно, можно добавить еще один параметр — количество обрабатываемых элементов:
function Max(a:mas100; n:integer):integer;
Это позволит ограничиться первыми n элементами массива, но размерность фактического параметра может быть только mas100.
Первый выход из столь неприятного положения заключается в том, чтобы передать массив как адрес параметра без типа:
function Max(var a; n:integer):integer;
type
b=array [1.. Maxlnt] of integer;
var
m,k:integer;
begin
m:=b(a}[1];
for k:=2 to n do
if m<b(a)[k] then m:=b(a)[k] ;
Max:=m;
end;
Несколько необычная запись b(а) означает, что нетипизированный параметр а приводится к типу целочисленного массива, каковым он на самом деле и является. Только функция мах об этом "не знает". Может показаться немного странным выбор верхней границы индекса в типе "b". Однако он позволяет избежать неприятностей, когда фактическое значение параметра n достаточно велико (при этом может возникнуть аварийная ситуация, вызванная выходом индекса за границы диапазона). Каким бы большим не было значение п, оно не может превысить величину Maxint, ибо массивы в Паскале не могут быть более 64 Кбайт.