Читайте также: |
|
Наиболее удобным способом рационального использования оперативной памяти для хранения массивов данных, размеры которых не определены или могут варьироваться в широких диапазонах, является применение динамических массивов. При объявлении таких массивов не указываются границы индексов. Объявив тип
tmas=array of Real;
можно использовать его для объявления динамических массивов, например,
var
A,B,C:tmas;
размеры которых можно задавать и изменять динамически (по мере необходимости), с помощью стандартной процедуры SetLength. Например, при выполнении SetLength(A,3) размер массива A станет равным 3. В дальнейшем с помощью процедуры SetLength можно увеличить или уменьшить размер массива. В динамических массивах для индексации используются только целые значения и минимальное значение индекса всегда 0. Минимальное значение индекса массива определяется стандартной функцией Low (всегда 0), максимальное значение индекса - стандартной функцией High, а длина (размер) – стандартной функцией Length (как для открытых массивов в подпрограммах). При увеличении размера прежние его элементы сохраняют свои значения, а новые элементы со значениями 0 добавляются в конец массива. При уменьшении размера пропадают элементы с наибольшими индексами, а остальные сохраняют свои значения. При задании нуля в качестве размера массива занимаемая им память освобождается полностью.
Объявив двумерные динамические массивы, например,
type tmatr=array of array of Real;
в подпрограмму можно будет передавать матрицу (двумерный массив) с произвольным количеством строк и столбцов. В общем случае, динамический массив с любым числом измерений и размерами может использоваться в качестве фактического параметра, соответствующего формальному параметру «открытый массив», причем в теле подпрограммы для любого его измерения можно будет найти длину и максимальное значение индекса (минимальное всегда равно 0), используя имя формального параметра и стандартные функции Length и High (для статических массивов при числе измерений, больше 2, для определения в подпрограмме диапазонов младших индексов потребуется использовать имена типов, что снижает универсальность подпрограммы). Например, для вычисления суммы элементов 3-мерного динамического массива X, имеющего тип tkmn
type
tmn=array of array of Integer;
tkmn=array of tmn;
подпрограмму можно оформить так
procedure Sum1(const a:array of tmn; out r:Integer);
var i,j,k:integer;
begin
r:=0;
for k:=Low(a) to High(a) do
for i:=Low(a[0]) to High(a[0]) do
for j:=Low(a[0,0]) to High(a[0,0]) do
r:=r+a[k,i,j];
end;
Выделение памяти и указание пределов изменения индексов по каждому измерению динамического массива производится в процессе выполнения программы путем использования процедуры SetLength(a,n). Нижняя граница индексов по любому измерению динамического массива всегда равна нулю. Наибольший индекс примет тогда значение n-1, где n- количество элементов массива, задаваемое при обращении к процедуре SetLength, а первый параметр – имя массива. При выделении памяти под матрицу можно выполнить следующее обращение SetLength(b,m,n) если матрица имеет прямоугольную форму, т.е. количество элементов во всех строках одинаково и равно n (m – количество строк матрицы).
Использование динамических массивов позволяет работать с матрицами, у которых в каждой строке может быть разное количество элементов. При выделении памяти для многомерных массивов (в частности, для хранения двумерных матриц) сначала устанавливается длина его первого измерения, затем второго, третьего и т.д. Например, выделим память для хранения элементов треугольной матрицы.
.....
var
a:array of array of Real;
n,l,j:Integer;
begin // РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ
ReadLn(n);
SetLength(a,n);
for i:=0 to n-1 do
Setlength(a[i],i+1);
.....
end.
При изменении длины уже созданного динамического массива сначала резервируется память для размещения нового массива, затем элементы старого массива копируются в новый массив, после чего освобождается память, выделенная под первоначальный массив.
Для освобождения памяти, помимо процедуры SetLength, использовать процедуру Finalize или идентификатору массива присвоить значение nil. Например, для освобождения памяти в предыдущем примере можно записать оператор a:=nil или Finalize(a).
Дата добавления: 2015-07-26; просмотров: 83 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Параметры - открытые массивы | | | Примеры программ с подпрограммами |