2

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

4

0 回答 0