я несколько озадачен следующей программеуказатель в качестве фиктивного аргумента
module test
implicit none
type TestType
integer :: i
end type
contains
subroutine foo(test)
type (TestType), intent(out) :: test
test%i = 5
end subroutine
subroutine bar(test)
type (TestType), intent(out) :: test
test%i = 6
end subroutine
end module
program hello
use test
type(TestType) :: t
call foo(t)
print *, t%i
call bar(t)
print *, t%i
end program hello
и его производных. Подробнее об этом позже. Как мы знаем, Fortran передает обычные аргументы в качестве перекрестных ссылок, что означает, что сущность, возникающая в аргументе фиктивного test
для обоих foo
и bar
, представляет собой то же пространство памяти, которое предоставляется в стеке в program hello
. Все идет нормально.
Предположим, я определяю в program hello
type(TestType) :: t
как указатель и выделяю его.
program hello
use test
type(TestType), pointer :: t
allocate(t)
call foo(t)
print *, t%i
call bar(t)
print *, t%i
deallocate(t)
end program hello
код работает, как и прежде, с той лишь разницей в том, что объект не был выделен в стеке, но в куче.
Предположим теперь, чтобы вернуться к программе стека выделяется и подпрограммой бар вместо определяется как
subroutine bar(test)
type (TestType), pointer :: test
test%i = 6
end subroutine
Программа не компилируется больше, потому что вы должны использовать кучи распределённая версию, чтобы сделать его работу, или, чтобы быть более точным, необходимо передать указатель на подпрограмму, когда подпрограмма определена, чтобы принять указатель в качестве фиктивного аргумента. С другой стороны, если фиктивный аргумент не содержит ключевое слово pointer
, подпрограмма будет принимать как указатели, так и не указатели.
Это заставляет меня задуматься ... в чем смысл объявления фиктивного аргумента указателем?
@Rook: Пойдите для этого ... :) –