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




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


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

Массивы-параметры в процедурах и функциях Паскаля

Первое ограничение, с которым сталкиваются программисты в Паскале, звучит следующим образом — если формальным параметром является массив, то его нельзя описать явным образом. Например, ошибочным является заголовок:

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 Кбайт.




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