使Fortran中的其他例程可以访问外部回调函数(LF95)

时间:2013-06-28 17:05:15

标签: callback fortran interop fujitsu-fortran

我遇到的问题与此处描述的问题非常相似:Make external functions accessible 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之外,然后从另一个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编译器。如果有人知道如何处理这个问题我会非常感激!

0 个答案:

没有答案