我有一个与此处描述的问题非常相似的问题:Make external functions access for other functions/modules in Fortran
我正在使用从 Fortran 源代码编译的 DLL,使用 Lahey/Fujitsu LF95 编译器,我正在尝试存储对外部回调函数(函数指针)的全局引用,以便以后可以从Fortran DLL 中的其他函数。
场景是这样的:
- 主机应用程序从 Fortran DLL 调用子例程(过程)并将引用传递给回调函数
- 对回调函数的引用应存储为全局
- 稍后,宿主应用程序可能会调用 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
,然后cbk
从不同的 Fortran 函数调用 。
这是我想要完成的示例:
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 编译器。如果有人知道如何处理这个我将非常感激!