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