Согласно Fortran WikiIntel fortran компилятор версии 14 должен поддерживать окончательную доработку, определенную в стандарте FORTRAN 2003. Я попытался использовать эту функцию с ifort 14, но наблюдал странное поведение. Следующий пример должен показать это:Завершение разработки в FORTRAN 2003
module mtypes
implicit none
type mytype
integer, private :: nr
contains
final :: delete_mytype
procedure :: print_mytype
end type
contains
!> \brief Constructs a new mytype
!! \return The created mytype
!>
function init_mytype(number)
type(mytype) :: init_mytype
integer, intent(in) :: number
! allocate(init_mytype)
init_mytype = mytype(number)
print *, 'init mytype', number
end function
!> \brief De-constructs a mytype object
!>
subroutine delete_mytype(this)
type(mytype) :: this !< The mytype object that will be finalized
print *, 'Deleted mytype!', this%nr
end subroutine delete_mytype
!> \brief Print something from mytype object
!>
subroutine print_mytype(this)
class(mytype) :: this !< The mytype object that will print something
print *, 'Print something from mytype!', this%nr
end subroutine print_mytype
end module mtypes
program main
use mtypes
type(mytype) :: t1, t2
call t1%print_mytype()
call t2%print_mytype()
t1 = mytype(1)
call t1%print_mytype()
t2 = init_mytype(2)
call t2%print_mytype()
end program main
В этом полном примере type mytype
определено, что имеет только одно значение nr
. Этот тип может быть создан с использованием простого конструктора типов, например. mytype(1)
или инициализирующая функция init_mytype
. Также определена подпрограмма print_mytype
, которая просто печатает mytype%nr
на стандартный вывод. Наконец, для окончательной доработки следует использовать подпрограмму final
delete_mytype
, хотя в данном примере она только печатает некоторую информацию в стандартный вывод.
Этот пример дает следующий результат:
Print something from mytype! 0
Print something from mytype! 0
Deleted mytype! 0
Print something from mytype! 1
Deleted mytype! -2
init mytype 2
Deleted mytype! 0
Deleted mytype! 2
Print something from mytype! 2
- Линия 1: Хорошо, t1 инициализируется со значением по умолчанию 0
- Line 2: Хорошо, t2 инициализируется значением по умолчанию 0
- Line 3: Хорошо, после присвоения нового объекта
t1%mytype(1)
старая версия удалена - Строка 4: Хорошо, версия с
nr = 1
напечатана - Строка 5: Странно, откуда взялась версия с
nr=-2
? - Line 6: Хорошо, версия с
nr = 2
инициализируется - Линия 7: Хорошо, после присвоения нового объекта
t2 = init_mytype(2)
старая версия будет удалена - Строка 8: Странно, t2 будет завершена до вызова
t2%print_mytype()
- Строка 9: Странно, t2 печатается после финализации
Это странное поведение, вызванное некоторой ошибкой ifort или вызвано неправильным применением функции завершения FORTRAN 2003, и я делаю что-то неправильно?
Было бы лучше установить значение по умолчанию в определении типа: integer, private :: nr = 0', чем полагаться на автоматическую инициализацию, выполняемую компилятором. При этом, насколько я знаю, ifort инициализирует все целые числа до нуля по умолчанию, поэтому я не уверен, что вызывает эти проблемы. На моей машине он печатает нуль на 5-й строке. –