Pointers Fortran中的过程指针

Pointers Fortran中的过程指针,pointers,fortran,procedure,windows-subsystem-for-linux,Pointers,Fortran,Procedure,Windows Subsystem For Linux,我试图得到一个通用子例程event()和一个指向这个通用子例程event_I的过程指针。然后我想创建任何子例程(如下面代码中的hello_world),并指向这个创建的子例程。你能帮我理解为什么第一个代码不工作而第二个代码工作吗?我在代码的第一个版本中得到的错误是:程序接收信号SIGSEGV:Segmentation fault-无效内存引用。我想使用第一个版本,因为这样我可以在子程序hello_world中使用main中定义的任何变量,而在第二种情况下,我必须将变量传递给te子程序,并且不能再

我试图得到一个通用子例程event()和一个指向这个通用子例程event_I的过程指针。然后我想创建任何子例程(如下面代码中的hello_world),并指向这个创建的子例程。你能帮我理解为什么第一个代码不工作而第二个代码工作吗?我在代码的第一个版本中得到的错误是:
程序接收信号SIGSEGV:Segmentation fault-无效内存引用
。我想使用第一个版本,因为这样我可以在子程序hello_world中使用main中定义的任何变量,而在第二种情况下,我必须将变量传递给te子程序,并且不能再将其定义为没有输入的通用子程序event()

第一版(不工作)

第二版(工作版):

我使用的是gfortran,编译器版本是

gfortran --version
GNU Fortran (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

这是一个稍微平凡的修改,它与gfortran配合得很好:

program foo

  implicit none

  abstract interface 
    subroutine event()
   end subroutine event
 end interface

  procedure(event), pointer :: event_i
  procedure(event), pointer :: event_j


 event_i => hello_world
 event_j => hello_world2

 call event_i
 call event_j


contains

 subroutine hello_world()
    print *, 'hello_world'
 end subroutine


 subroutine hello_world2()
   print *, 'HELLO_WORLD'
 end subroutine

end program foo

第一个版本不工作(给我分段错误),第二个版本工作正常。我为这个不清楚的问题道歉。欢迎收听堆栈溢出。永远不要说“它不起作用”或“它不起作用”,真的从来没有。说出实际发生的事情。它会崩溃吗?它会给出错误的结果吗?它是如何崩溃的?有错误消息吗?确切的信息是什么?哪些是错误的结果?好的结果应该是什么样子?你是对的,我们可能没有得到真正的代码。这当然是个问题@fdevita请做一个测试,我们可以测试我们自己,真正编译。我已经修复了print语句中未终止字符的错误,添加了第一个版本给出的错误,并指定了编译器版本。因此,如果需要使用WSL,似乎必须避免使用Fortran 2008的这一功能。根据英特尔Fortran在Windows上可能使用不同的机制。这个解释适用于GCC中的C嵌套函数,但对gfortran仍然有效。你能解释一下区别是什么,特别是为什么在问题的版本不存在的情况下它可以工作吗?我已经尝试了代码,但它给出了与前一个代码相同的Segmentatio错误。我看到的唯一区别是接口上的抽象限定符。。。我真的不明白在这种情况下这有什么关系
gfortran --version
GNU Fortran (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
program foo

  implicit none

  abstract interface 
    subroutine event()
   end subroutine event
 end interface

  procedure(event), pointer :: event_i
  procedure(event), pointer :: event_j


 event_i => hello_world
 event_j => hello_world2

 call event_i
 call event_j


contains

 subroutine hello_world()
    print *, 'hello_world'
 end subroutine


 subroutine hello_world2()
   print *, 'HELLO_WORLD'
 end subroutine

end program foo