Я новичок в Фортане, и у меня есть вопрос относительно использования функций обратного вызова, доступных для всего кода Фортрана.
Я пишу на интерфейсе, который обращается к 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#-функции были доступны из других функций вне MainFunction и даже в разных модулях.
Я пытался использовать указатели функций для решения этой проблемы, но всегда получаю следующую ошибку при вызове m_vdiTestFuncCllBak. Вызов vdiTestFuncCllBak работает без проблем.
Такое же поведение при инициализации указателя в функции или во внешнем модуле.
Вызывается следующий код С#:
private void vdiTestFunc(ref int inputValue, ref int retValue)
{
retValue = inputValue + 1;
return;
}
Проблема в том, что ссылки inputValue и retValue не устанавливаются при использовании funtionpointer.
У кого-то была такая же проблема раньше, и он знает возможное решение или имеет ссылку с помощью? Я не нашел информации об этом в моих поисках.
Я использую компилятор Intel 11.
Помощь очень ценится.