1

我有一个与此处描述的问题非常相似的问题: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 编译器。如果有人知道如何处理这个我将非常感激!

4

0 回答 0