我有一个程序指针,我需要传递一些函数,并在使用gfortran编译时崩溃(但不能使用ifort)。以下是演示此问题的最小示例:
module mod1 abstract interface function f(x) double precision f double precision, intent(in) :: x end function f end interface contains subroutine printme(g) procedure(f), pointer, intent(in) :: g write(*,*) g(1d0), g(2d0), g(3d0) end subroutine printme subroutine printme2(g) procedure(f), pointer, intent(in) :: g call printme(g) end subroutine printme2 end module mod1 program test use mod1 procedure(f), pointer :: pg pg => g call printme2(pg) contains function g(x) double precision g double precision, intent(in) :: x g = x**2 return end function g end program test
显然在我的程序中,我的“printme2”版本不仅仅是这个,但你明白了。它多次调用另一个例程,并且每次都传递过程指针。现在使用英特尔编译器,这可以按预期工作:
$ ifort segfault.f90 && ./a.out 1.00000000000000 4.00000000000000 9.00000000000000
但是,使用gfortran(v4.4.5-8):
$ gfortran segfault.f90 && ./a.out Segmentation fault
请注意,如果我在测试程序中将printme2
替换为printme
,则它可以正常工作。
为什么会这样?我做错了什么,我该如何做对?