Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. А– популяционные и динамические характеристики тревожности.
  2. Б. Динамические процессы
  3. Гидродинамические процессы в барабане парового котла
  4. Гидродинамические процессы в барабане парового котла.
  5. Гидродинамические характеристики крыльев
  6. Двумерные массивы
  7. ДИНАМИЧЕСКИЕ ВЕЛИЧИНЫ И ЭЛЕМЕНТЫ ТЕОРИИ НАПРЯЖЕНИЙ

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

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 | Нарушение авторских прав


Читайте в этой же книге: Процедуры | Список формальных параметров | Задания 5.1 для самостоятельной проработки | Обращение к функции | Пример 5.2 выполнения задания | Задания 5.2 для самостоятельной проработки | Рекурсивные подпрограммы | Пример выполнения задания на составление рекурсивной подпрограммы |
<== предыдущая страница | следующая страница ==>
Параметры - открытые массивы| Примеры программ с подпрограммами

mybiblioteka.su - 2015-2024 год. (0.007 сек.)