我对以下程序有些困惑
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
. 到目前为止,一切都很好。
假设我在 as 中定义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
代码和以前一样工作,唯一的区别是对象不是在堆栈上分配,而是在堆上。
现在假设回到堆栈分配的程序,子程序 bar 被定义为
subroutine bar(test)
type (TestType), pointer :: test
test%i = 6
end subroutine
该程序不再编译,因为您必须使用堆分配版本才能使其工作,或者更准确地说,当例程被定义为接受指针作为虚拟参数时,必须将指针传递给例程。另一方面,如果虚拟参数不包含pointer
关键字,则例程将接受指针和非指针。
这让我想知道......将虚拟参数声明为指针有什么意义?