Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 Подпрограммы.doc
Скачиваний:
25
Добавлен:
09.02.2015
Размер:
369.15 Кб
Скачать

Динамические массивы

Наиболее удобным способом рационального использования оперативной памяти для хранения массивов данных, размеры которых не определены или могут варьироваться в широких диапазонах, является применение динамических массивов. При объявлении таких массивов не указываются границы индексов. Объявив тип

  1. tmas=array of Real;

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

  1. var

  2. A,B,C:tmas;

размеры которых можно задавать и изменять динамически (по мере необходимости), с помощью стандартной процедуры SetLength. Например, при выполненииSetLength(A,3)размер массиваAстанет равным 3. В дальнейшем с помощью процедурыSetLengthможно увеличить или уменьшить размер массива. В динамических массивах для индексации используются только целые значения и минимальное значение индекса всегда 0. Минимальное значение индекса массива определяется стандартной функциейLow(всегда 0), максимальное значение индекса - стандартной функциейHigh, а длина (размер) – стандартной функциейLength(как для открытых массивов в подпрограммах). При увеличении размера прежние его элементы сохраняют свои значения, а новые элементы со значениями 0 добавляются в конец массива. При уменьшении размера пропадают элементы с наибольшими индексами, а остальные сохраняют свои значения. При задании нуля в качестве размера массива занимаемая им память освобождается полностью.

Объявив двумерные динамические массивы, например,

  1. type tmatr=array of array of Real;

в подпрограмму можно будет передавать матрицу (двумерный массив) с произвольным количеством строк и столбцов. В общем случае, динамический массив с любым числом измерений и размерами может использоваться в качестве фактического параметра, соответствующего формальному параметру «открытый массив», причем в теле подпрограммы для любого его измерения можно будет найти длину и максимальное значение индекса (минимальное всегда равно 0), используя имя формального параметра и стандартные функции LengthиHigh(для статических массивов при числе измерений, больше 2, для определения в подпрограмме диапазонов младших индексов потребуется использовать имена типов, что снижает универсальность подпрограммы). Например, для вычисления суммы элементов 3-мерного динамического массиваX, имеющего типtkmn

  1. type

  2. tmn=array of array of Integer;

  3. tkmn=array of tmn;

подпрограмму можно оформить так

  1. procedure Sum1(const a:array of tmn; out r:Integer);

  2. var i,j,k:integer;

  3. begin

  4. r:=0;

  5. for k:=Low(a) to High(a) do

  6. for i:=Low(a[0]) to High(a[0]) do

  7. for j:=Low(a[0,0]) to High(a[0,0]) do

  8. r:=r+a[k,i,j];

  9. end;

Выделение памяти и указание пределов изменения индексов по каждому измерению динамического массива производится в процессе выполнения программы путем использования процедуры SetLength(a,n). Нижняя граница индексов по любому измерению динамического массива всегда равна нулю. Наибольший индекс примет тогда значениеn-1, гдеn- количество элементов массива, задаваемое при обращении к процедуреSetLength, а первый параметр – имя массива. При выделении памяти под матрицу можно выполнить следующее обращениеSetLength(b,m,n)если матрица имеет прямоугольную форму, т.е. количество элементов во всех строках одинаково и равноn(m– количество строк матрицы).

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

  1. . . . . .

  2. var

  3. a:array of array of Real;

  4. n,l,j:Integer;

  5. begin// РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  6. ReadLn(n);

  7. SetLength(a,n);

  8. for i:=0 to n-1 do

  9. Setlength(a[i],i+1);

  10. . . . . .

  11. end.

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

Для освобождения памяти, помимо процедуры SetLength, использовать процедуру Finalize или идентификатору массива присвоить значение nil. Например, для освобождения памяти в предыдущем примере можно записать оператор a:=nil или Finalize(a).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]