我想将fortran接口打包成一个独立的库,类似于c/c++中的头文件。这是我的密码。问题是,我想调用"hello“子程序来运行"hello”子程序。有人能帮我吗?
我想把接口和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发布于 2013-11-01 21:42:59
这在子模中是很容易实现的,不幸的是它们还没有被广泛使用。因此,我认为当前的解决方案是使用"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所指出的,您可以使用接口声明为例程配备一个显式接口,您将在其中调用它。
第二次更新:
如果你把这些放进三个不同的文件
您应该能够像这样编译一个可执行文件:
gfortran -c demo.f90 hello.f90 test.f90
gfortran *.o第一行创建对象文件,第二行将它们链接在一起。注意,顺序很重要,在编译demo.f90之前,需要提供test.f90的模块信息。
https://stackoverflow.com/questions/19727713
复制相似问题