Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

4. Массивы

...

! и ссылку-скаляр ra

deallocate(ade, ra, b)

! Освобождаем динамическую память

Замечания:

1. Хорошей практикой является освобождение оператором DEALLOCATE выделенной динамической памяти, когда надобность в ней отпадает. Это позволяет избежать накопления неиспользуемой и недоступной памяти.

2. Фортран 95 ввел автоматическое освобождение размещаемых массивов, объявленных в процедурах. Оно работает так: если при выходе из процедуры пользователь явно оператором DEALLOCATE не освободил занимаемую размещаемым массивом память, то теперь это произойдет автоматически. Это новое свойство делает язык более надежным. Например, в FPS, который не поддерживает стандарт Фортран 95, следующий код

program t4

 

call a( )

 

call a( )

! Второй вызов в FPS завершится ошибкой

end program t4

 

subroutine a( )

 

real, allocatable :: b (:)

 

print *, allocated(b)

! FPS при первом вызове напечатает F, при втором - T

allocate(b(10))

! CVF в обоих вызовах напечатает F

end

 

приведет к возникновению ошибки: run-time error F6316 - array already allocated, которая приведет к прекращению вычислений. В CVF оба вызова завершатся благополучно.

4.8.3. Автоматические массивы

В процедуре может быть задан локальный массив, размеры которого

меняются при разных вызовах процедуры. Такие массивы,

так же как

и локальные строки переменной длины (разд. 3.8.3),

относятся

к автоматическим объектам.

 

Пример. Создать процедуру обмена содержимого двух массивов.

program shos

integer, parameter :: n = 5 integer k

real :: a(n) = (/ (1.0, k = 1, n) /), b(n) = (/ (2.0, k = 1, n) /)

interface

 

subroutine swap(a, b)

! При использовании перенимающих форму

real a(:), b(:)

! массивов требуется задание явного интерфейса

end subroutine swap

 

end interface

 

call swap(a, b)

 

131