我是 Fortan 的新手,并且有一个关于使用 make 回调函数可用于整个 fortran 代码的问题。
我正在编写一个从 C# 访问 Fortran DLL 的接口。
module csWrapper
interface
subroutine vdiTestFuncCllBak(inputValue, retValue)
INTEGER, INTENT(IN) :: inputValue
INTEGER, INTENT(INOUT) :: retValue
end subroutine
end interface
procedure(vdiTestFuncCllBak), pointer :: m_vdiTestFuncCllBak
end module csWrapper
module VdiFunctionRunnerMain
use csWrapper
implicit none
contains
integer function VdiFunctionRunner (XTGA, ARRAY_810, vdiCwertCllbak, vdiIwertCllbak, vdiRwertCllbak, vdiCwert2Cllbak, vdiIwert2Cllbak, vdiRwert2Cllbak, vdiErsterCllBak, vdiLetzterCllBak, vdiTestFuncCllBak)
!DEC$ ATTRIBUTES DLLEXPORT ::VdiFunctionRunner
!DEC$ ATTRIBUTES REFERENCE :: XTGA, ARRAY_810, vdiCwertCllbak, vdiIwertCllbak, vdiRwertCllbak, vdiCwert2Cllbak, vdiIwert2Cllbak, vdiRwert2Cllbak, vdiErsterCllBak, vdiLetzterCllBak, vdiTestFuncCllBak
implicit none
external vdiCwertCllbak, vdiIwertCllbak, vdiRwertCllbak, vdiCwert2Cllbak, vdiIwert2Cllbak, vdiRwert2Cllbak, vdiErsterCllBak, vdiLetzterCllBak, vdiTestFuncCllBak
!procedure(vdiErsterCllBak), pointer :: m_vdiErsterCllBak
CHARACTER (len=256) XTGA
CHARACTER (len=256) TGA, ARRAY_810(10), retValue, satzArt, satzArt2
CHARACTER (len=256) :: cWertCallBackRet
integer :: nrReturnValues = 1
m_vdiTestFuncCllBak => vdiTestFuncCllBak
call vdiTestFuncCllBak(nrReturnValues, nrReturnValues)
call m_vdiTestFuncCllBak(1, nrReturnValues)
VdiFunctionRunner = nrReturnValues
end function VdiFunctionRunner
end module VdiFunctionRunnerMain
因为 Fortran 代码需要使用 C# 代码的某些功能,所以将两个委托传递给 Fortran 代码(vdiCwertCllbak、vdiIwertCllbak)。
这在 MainFunction 中使用时效果很好,因此接口工作到目前为止。
现在需要的是,c#-functions 必须可以从 MainFunction 之外的其他函数甚至在不同的模块中使用。
我尝试使用函数指针来处理这个问题,但是在调用 m_vdiTestFuncCllBak 时总是出现以下错误。调用 vdiTestFuncCllBak 没有问题。
在函数或外部模块中初始化指针时,行为相同。
调用以下 c# 代码:
private void vdiTestFunc(ref int inputValue, ref int retValue)
{
retValue = inputValue + 1;
return;
}
问题是,使用函数指针时没有设置 inputValue 和 retValue 的引用。
是否有人以前遇到过同样的问题并且知道可能的解决方案或有帮助链接?我在搜索中没有找到有关这方面的信息。
我正在使用 Intel 11 编译器。
非常感谢您的帮助。