1

我想将 fortran 接口打包为独立库,类似于 c/c++ 中的头文件。这是我的代码。问题是我想调用“hello”子程序来运行“hello”子程序。谁能帮我吗?

我想把 Interface 和 set_callback,invoke_callback 作为一个独立的模块文件。

MODULE DEMO
  INTERFACE
    SUBROUTINE callback_prototype(callbackID)
        CHARACTER(*) :: callbackID
    END SUBROUTINE callback_prototype
  END INTERFACE

  PROCEDURE( callback_prototype ), POINTER :: f_ptr => NULL()

  CONTAINS
  SUBROUTINE set_callback(func)
     IMPLICIT NONE
     EXTERNAL :: func

      f_ptr => func
      call HELLO
  END SUBROUTINE

  SUBROUTINE invoke_callback(callbackID)
      CHARACTER(*) :: callbackID
      if (associated(f_ptr)) call f_ptr(callbackID)
  END SUBROUTINE

  SUBROUTINE HELLO

  IMPLICIT NONE

  Dosomething

  END SUBROUTINE
END MODULE
4

1 回答 1

1

使用子模块很容易做到这一点,不幸的是它们没有被广泛使用。因此,我想当前的解决方案是将“hello”用作具有隐式接口的外部函数并将其放入不同的文件中。

更新:基于您的代码的一些示例。

subroutine HELLO
  implicit none

  write(*,*) 'HELLO'

end subroutine HELLO

module demo
  implicit none

  interface
    subroutine callback_prototype(callbackID)
      character(*) :: callbackID
    end subroutine callback_prototype
  end interface

  procedure(callback_prototype), pointer :: f_ptr => NULL()

contains

  subroutine set_callback(func)
    procedure(callback_prototype) :: func
    external :: HELLO

    f_ptr => func
    call HELLO()
  end subroutine set_callback

  subroutine invoke_callback(callbackID)
    character(*) :: callbackID
    if (associated(f_ptr)) call f_ptr(callbackID)
  end subroutine invoke_callback

end module demo

program test_demo
  use demo

  implicit none

  write(*,*) 'small program'
end program test_demo

将其放入文件 test.f90,并运行“gfortran test.f90”会生成一个可执行文件。当然,如果您想将这些东西分开,您宁愿将每个部分放在单独的文件中。然后,您必须确保在链接期间包含包含“hello”的目标文件。正如 Vladimir_F 所指出的,您可以使用接口声明来为例程配备一个显式接口,您可以在其中调用它。

第二次更新:

如果你把它们放到三个不同的文件中

  • 你好.f90
  • 演示.f90
  • 测试.f90

您应该能够像这样从中编译出可执行文件:

gfortran -c demo.f90 hello.f90 test.f90
gfortran *.o

第一行创建目标文件,而第二行将它们链接在一起。请注意,该顺序很重要,demo.f90 的模块信息需要在编译 test.f90 之前可用。

于 2013-11-01T21:42:59.747 回答