Когда я инициализирую объект внутри функции или подпрограммы и пытаюсь его вернуть, элемент указателя, который был установлен в конструкторе, кажется, становится неопределенным (хотя я могу неправильно истолковывать происходящее).
Я хотел бы точно понять, что здесь происходит, и, если возможно, как инициализировать указатель внутри конструктора, а затем вернуть объект из функции или подпрограммы, сохранив указатель.
MWE:
program mwe
implicit none
type a
integer var
end type a
type b
type(a), pointer :: elt
end type b
interface b
procedure construct_b
end interface
type(b) val_func, val_sub
val_func = get_new_b(52)
write(*,*) 'using function: ', val_func%elt%var
call new_b(val_sub, 55)
write(*,*) 'using subroutine: ', val_sub%elt%var
contains
function construct_b(elt) result(r)
class(a), target, intent(in) :: elt
type(b) r
r%elt => elt
end function
function get_new_b(n) result(r)
integer, intent(in) :: n
type(b) r
type(a) elt
elt = a(n)
r = b(elt)
write(*,*) 'get_new_b: ', r%elt%var
end function
subroutine new_b(r, n)
type(b), intent(inout) :: r
integer, intent(in) :: n
type(a) elt
elt = a(n)
r = b(elt)
write(*,*) 'new_b: ', r%elt%var
end subroutine
end program mwe
Использование gfortran 5.4.0,
$ gfortran -o mwe.x mwe.f90
$ ./mwe.x
get_new_b: 52
using function: 127919104
new_b: 55
using subroutine: 127919104
Ожидаемый результат:
get_new_b: 52
using function: 52
new_b: 55
using subroutine: 55