Массивы переменной длины (динамические массивы) и открытые массивы (с неопределёнными границами) в параметрах процедуры. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Массивы переменной длины (динамические массивы) и открытые массивы (с неопределёнными границами) в параметрах процедуры.



Обычно размеры массива неизменны и поэтому должны описываться явно с

помощью констант, задающих нижнюю и верхнюю границы диапазона, или назва-

ний типов. Такие массивы называются статическими. Паскаль позволяет опреде-

лять также динамические массивы, размер которых заранее не известен и может

меняться во время работы программы. Для описания динамических массивов ука-

зывать диапазоны значений его измерений не нужно.

type TDynArray: array of integer;

Первоначально в переменной, описанной как динамический массив, нет ни одного

элемента. Ее размер задается с помощью стандартной процедуры SetLengthQ.

В качестве первого параметра указывается имя переменной, в качестве второго —

число элементов в массиве. Если новое число элементов больше старого, то новые

элементы добавляются в конец массива, а ихзначения исходно будут не определены.

Если новое число элементов меньше старого, то последние элементы массива отбра-

сываются и теряются. Отсчет элементов динамического массива всегда начинается

с нуля.

var a: TDynAirray;

begin

SetLengthl a, 1);

а[0]:= 2;

Чтобы освободить память, выделенную динамическому массиву, и сделать его

длину нулевой, надо соответствующей переменной присвоить значение nil:

а:= nil;

'J ЗАМЕЧАНИЕ Ключевое слово языка Паскаль nil обозначает «отсутствие значе-

ния».

Определение собственных типов данных 43

После этого в массиве а не окажется ни одного значения. В дальнейшем длину

массива а можно изменить снова.

Как и статические массивы, динамические массивы могут иметь несколько изме-

рений. Для каждого из измерений при описании массива надо повторить описание

array of. Например, если требуется объявить динамический массив целых чисел с

двумя измерениями, надо записать так:

type ТЗПАггау = array of array of integer;

Далее надо объявить размер этого массива по каждому измерению. Реализация

динамических массивов в Паскале позволяет, в отличие от описания статических

массивов, задавать разные диапазоны для одного измерения. Например, когда опи-

сан двумерный массив (обычно это карта, график, иоле), сначала задается размер

по первому измерению (число столбцов):

var D: ТЗВАггау;

begin

SetLength(D,4);

Далее нужно указать число элементов для каждого из четырех столбцов (при опи-

сании статических массивов это число считается одинаковым для всех столбцов).

Длина соответствующего столбца задается указанием имени массива с номером

столбца с помощью процедуры SetLength():

SetLength(D[0], 3);

SetLengthl D[l], 5);

SetLengthf D[2], 30 ],-

SetLengthf D[3], 1);

ПОДСКАЗКА Динамические массивы позволяют существенно экономить память

и запрашивать ее у операционной системы по мере необходимо-

сти, однако работа с ними в программе происходит значительно

медленнее, чем со статическими массивами.

Передача массивов в качестве параметров

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

зании этого типа для параметра подпрограммы. Однако таким способом удается

обрабатывать только динамические массивы и статические массивы заранее задан-

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

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

сива, должна уметь получать в качестве параметра массив любой длины. Динами-

Подпрограммы 59

ческие массивы использовать не всегда удобно и не всегда правильно, так как они

ухудшают эффективность работы программы.

В Паскале разрешается указывать в качестве параметров массив с неопределенными

границами.

procedure Sum(A: array of Byte);

ВНИМАНИЕ Данное описание похоже но описание динамического массива, но

не является токовым. Это просто форма записи параметра подпро-

граммы для передачи статического массива заранее не известной

длины.

Теперь массив, описанный как

var Ar: array [1..25] of Byte;

можно без проблем передавать в процедуру Sum:

Sum(Ar];

При этом внутри тела подпрограммы действуют следующие правила:

О Нумерация элементов массива начинается с нуля (число элементов можно

определить с помощью стандартной функции SizeOf);

О Функция High возвращает верхнюю границу массива (равную SizeOf()-l);

О Копирование массива одним оператором присваивания не разрешается;

О Вместо массива в подпрограмму может быть передана обычная переменная

соответствующего типа. Внутри подпрограммы она будет представлена в

виде массива из одного элемента (с индексом 0).__



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 233; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.59.231 (0.007 с.)