
- •Lesson 4 Массивы
- •Одномерные массивы Описание одномерных массивов
- •Ввод и вывод одномерных массивов Ввод одномерного массива
- •Вывод одномерного массива
- •Integer:: I
- •Примеры задач.
- •Многомерные массивы
- •Секции массива
- •Размещение массивов в памяти
- •Ввод и вывод массивов
- •Ввод двумерного массива
- •Вывод двумерного массива
- •Примеры задач.
- •Характеристики массивов
- •Форма массива. Конформные массивы
- •Функции shape и size
- •Выражения с массивами и присваивание массивов
- •Оператор и конструкция where
- •Динамические массивы
Динамические массивы
Атрибут dimensionописывает массивы. Параметром этого атрибута должен быть список границ индексов по каждому измерению. Количество измерений определяет ранг массива. Массив, границы индексов которого определены как константные выражения, называется статическим. Память для статического массива резервируется на этапе компиляции программы. Размер такого массива не может быть изменен в процессе вычислений.
Размер массива не всегда известен заранее. Например, для его определения нужно ввести некоторые данные или произвести вычисления. В таком случае можно использовать динамические массивы.
Динамический массив – это массив, размер которого определяется при выполнении программы, тогда же происходит и выделение памяти под него. Протяженности динамического массива по измерениям на этапе компиляции неизвестны, и атрибутdimensionопределяет только ранг «будущего» массива. Список измерений сводится к списку разделенных запятыми двоеточий, число которых равно рангу массива.
Признаком динамического массива является атрибут allocatableв его описании, например:
real, allocatable, dimension(:,:) :: X
Определение фактических границ массива и выделение памяти для него производится оператором allocateна этапе выполнения программы, когда размер динамического массива уже определен.
Общий вид оператора allocate:
allocate(список выделяемых массивов)
где каждый элемент списка массивов имеет вид:
имя массива (нижняя граница:верхняя граница)
По умолчанию значение нижняя границаравно 1.
Пример.
real, allocatable, dimension(:,:) :: X
integer, allocatable, dimension(:) :: Y
. . .
N = 5
allocate(X(1:N,1:N)) ! Выделение памяти для X: X(1:5, 1:5)
allocate(Y(1:Size(X)))!Выделение памяти для Y: Y(1:25)
где N– переменная целого типа с определенным положительным значением. Размер одномерного массиваYравен размеру (количеству элементов) двумерного массиваX.
Выделенная память автоматически не освобождается, ее необходимо освобождать оператором deallocate, например:
deallocate(X, Y)