
- •Алфавит, лексемы, ключевые слова языка Фортран. Метки. Комментарии.
- •Структура программы. Внешние подпрограммы. Внутренние подпрограммы. Модули.
- •Переменные. Переменная – это величина, которая может в программе принимать различные значения.
- •Условный оператор if... Then...End if.
- •12.Неявное определение типа.
- •13. Синтаксис определения производных типов
- •14. Атрибут parameter. Именованные константы и константные выражения
- •15. Атрибуты dimension и allocatable. Описание массивов.
- •16. Атрибут intent. Описание формальных параметров.
- •17. Определенные и неопределенные переменные. Выражения с массивами и присваивание массивов.
- •24,Внешние подпрограммы.
- •30.Оператор use
- •31.Основные сведения о массивах
- •32.Массивы. Динамические массивы.
- •33.Операторы allocate, deallocate.
- •34.Форматирование ввода-вывода. Оператор format.
- •35.Соединение файла с логическим устройством
- •Алфавит, лексемы, ключевые слова языка Фортран. Метки. Комментарии.
- •15. Атрибуты dimension и allocatable. Описание массивов.
- •18. Скалярные числовые выражения и скалярное числовое присваивание.
- •27. Модули. Области общей памяти.
32.Массивы. Динамические массивы.
Динамические массивы
Размер массива не всегда известен заранее; для того, чтобы определить его, нужно, например, считать некоторые данные или произвести вычисления
В таком случае можно использовать динамические массивы или массивы- ссылки, память под которые выделяется в ходе исполнения программы.
Динамический массив должен описываться с атрибутом allocatable, например:
REAL, ALLOCATABLE, DIMENSION(:,:) :: X Экстенты динамического массива при описании не указываются, так как
они к этому времени неизвестны; указывается только ранг массива.
Выделение памяти и определение фактических границ массива производится оператором allocate:
ALLOCATE(X (N, N))
где n — переменная целого типа с определенным положительным значением. Выделенная память автоматически не освобождается, ее необходимо освобождать оператором deallocate:
DEALLOCATE(X) Того же результата можно добиться, используя ссылку на массив — память под ссылки также может быть выделена динамически:
REAL, POINTER, DIMENSION(:, :, :) :: Y
ALLOCATE(Y(2:10, 3:K, -2:K - 1), STAT = IER)
33.Операторы allocate, deallocate.
Общий вид оператора allocate:
ALLOCATE(список_вьщеляемых_объектов [,STAT = состояние]), где список_выделяемых_объектов — это разделенный запятыми перечень имен массивов или ссылок с указанием границ в виде:
имя_объекта[([нижняя_граница:]верхняя_граница)]
В качестве нижней и верхней границ может использоваться скалярное выражение целого типа. По умолчанию значение нижняя_граница равно 1.
В момент выделения памяти границы выделяемых объектов неопределенны и не могут использоваться в составе выражений. Нельзя, например, в рамках одного оператора использовать результат встроенной функции size:
ALLOCATE(Y(N, N, N) , X(SIZE(Y))
[неверно: границы массива Y еще не определены!
Но совершенно правильно использование ссылки на границы массива, выделенного предыдущим оператором:
ALLOCATE(Y(N, N, N))
ALLOCATE(X{SIZE(Y))
Необязательный ключевой параметр stat содержит информацию о результате выполнения операции выделения памяти. Параметр stat должен быть переменной целого типа, не входящей в состав выделяемых объектов. Если выделение прошло успешно, переменная состояние принимает значение 0; если выделить память не удалось, то эта переменная принимает положительное значение.
В принципе, при наличии ссылок, выделяемые массивы и не были бы нужны; но ссылки, кроме способности занимать память динамически, обладают рядом свойств, которые нельзя не учитывать. Оператор allocate выделяет
ссылке нового адресата даже в том случае, когда она прикреплена к другому адресату. Если предыдущий адресат был создан также оператором allocate
и не имеет других прикрепленных к нему ссылок, он становится недоступен — так может возникнуть утечка памяти.
Оператор deallocate в общем виде:
DEALLOCATE(список_вьщеленных_объектов[,STAT = состояние]) подобен оператору allocate, кроме того, что в списке выделенных объектов не нужно указывать границ. Необязательный ключевой параметр stat содержит информацию о результате выполнения операции освобождения памяти. Параметр stat должен быть переменной целого типа, не входящей в состав список_выделенных_объектов. Если освобождение памяти прошло успешно, переменная состояние принимает значение 0; если освободить память не удалось, то эта переменная принимает положительное значение
При отсутствии параметра stat неудача при освобождении памяти приводит к прекращению исполнения программы.