我遇到的问题与此处描述的问题非常相似:Make external functions accessible for other functions/modules in Fortran
我正在使用从Fortran源代码编译的DLL,使用Lahey / Fujitsu LF95编译器,我正在尝试存储对外部回调函数(函数指针)的全局引用,以便可以在稍后来自Fortran DLL中的其他函数。
场景是这样的:
问题是问题中接受的答案不能用Lahey Fortran编译器编译。显然,英特尔编译器和LF95编译器之间存在很多差异。
我确实得到了回调引用,可以在单个子例程中正常工作,如下所示:
subroutine testcallback(cbk)
dll_export :: testcallback ! Lahey LF95 extern declaration to export this function
character(len=*) :: text
interface
subroutine cbk (string, length)
character(len=*), intent (in) :: string
integer, intent (in) :: length
end subroutine cbk
end interface
text = "Hello World"
call cbk(text, len(text)) ! invoke the cbk callback; works very well
return
end
从宿主应用程序调用此函数(在我的情况下是C#,但这是无关紧要的)非常有效。我可以传入一个函数引用(C#中的委托),Fortran正确调用,我得到了预期的结果。
问题是我似乎无法将interface
声明移到testcallback
之外,然后从另一个Fortran函数调用cbk
。
以下是我想要完成的一个例子:
subroutine setcallback(cbk)
dll_export :: setcallback ! Lahey LF95 extern declaration to export this function
interface
subroutine cbk (string, length)
character(len=*), intent (in) :: string
integer, intent (in) :: length
end subroutine cbk
end interface
! instead of calling cbk here, I'd like to save a reference to it and make it
! available to other functions..
return
end
subroutine testcallback()
dll_export :: testcallback ! Lahey LF95 extern declaration to export this function
character(len=*) :: text
text = "Hello World Again"
! somehow I want to be able to invoke the stored reference to cbk here
!
call cbk(text, len(text)) ! this obviously doesn't work like this
return
end
最后我想补充一点,此时不再是LF95编译器。如果有人知道如何处理这个问题我会非常感激!