我有一个过程指针,我需要向下传递一些函数,并且在使用 gfortran(但不是使用 ifort)编译时它会崩溃。这是一个演示问题的最小示例:
模块 mod1
抽象接口
函数 f(x)
双精度 f
双精度,intent(in) :: x
结束函数 f
端接口
包含
子程序 printme(g)
过程(f),指针,意图(in)::g
写(*,*) g(1d0), g(2d0), g(3d0)
结束子程序 printme
子程序 printme2(g)
过程(f),指针,意图(in)::g
调用 printme(g)
结束子程序 printme2
结束模块 mod1
程序测试
使用 mod1
过程(f),指针 :: pg
pg => g
调用 printme2(pg)
包含
函数 g(x)
双精度 g
双精度,intent(in) :: x
g = x**2
返回
结束函数 g
结束程序测试
显然,在我的程序中,我的“printme2”版本不仅仅做这些,但你明白了。它多次调用另一个例程,并且每次都传递过程指针。现在使用英特尔编译器可以按预期工作:
$ ifort segfault.f90 && ./a.out 1.00000000000000 4.00000000000000 9.00000000000000
但是,使用 gfortran (v4.4.5-8):
$ gfortran segfault.f90 && ./a.out 分段故障
请注意,如果我在测试程序中替换printme2为,它会起作用。printme为什么会这样?我做错了什么,我该如何做对?