首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将fortran接口打包为独立模块

如何将fortran接口打包为独立模块
EN

Stack Overflow用户
提问于 2013-11-01 13:29:23
回答 1查看 434关注 0票数 1

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

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-01 21:42:59

这在子模中是很容易实现的,不幸的是它们还没有被广泛使用。因此,我认为当前的解决方案是使用"hello“作为一个带有隐式接口的外部函数,并将其放入另一个文件中。

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

代码语言:javascript
复制
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所指出的,您可以使用接口声明为例程配备一个显式接口,您将在其中调用它。

第二次更新:

如果你把这些放进三个不同的文件

  • hello.f90
  • demo.f90
  • test.f90

您应该能够像这样编译一个可执行文件:

代码语言:javascript
复制
gfortran -c demo.f90 hello.f90 test.f90
gfortran *.o

第一行创建对象文件,第二行将它们链接在一起。注意,顺序很重要,在编译demo.f90之前,需要提供test.f90的模块信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19727713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档