我有一个过程指针,我需要向下传递一些函数,并且在使用 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
为什么会这样?我做错了什么,我该如何做对?