У меня примерно следующая ситуация. У меня есть функция C ++, которая вызывается из кода Фортрана и принимает в качестве аргументов указатель на функцию и указатель на пустоту
int STDCALL FORTRAN_NAME(CPPFunction, CPPFUNCTION)(
int (*userFunction)(const int *object,
const void *userFunctionUserData),
const void *userData)
{
// ...
int index;
int result;
// ...
result = userFunction(&index, userData);
// ...
}
Это называется из Фортрана, как это
! ...
DOUBLE PRECISION, ALLOCATABLE :: data(:,:)
INTEGER :: n, result
! ...
ALLOCATE(data(3,n)); data = 0.0
! ... fill data with something
result = CPPFUNCTION(FORTRANFUNCTION, data)
! ...
Функция Fortran, которую я хочу передать через указатель на функцию, выглядит так:
INTEGER FUNCTION FORTRANFUNCTION(idx, data)
IMPLICIT NONE
INTEGER, INTENT(IN) :: idx
DOUBLE PRECISION, INTENT(IN) :: data(*)
INTEGER :: i, offset
offset = 3 * (idx - 1)
WRITE(*,*) 'data(offset + 1) = ', data(offset + 1)
WRITE(*,*) 'data(offset + 2) = ', data(offset + 2)
WRITE(*,*) 'data(offset + 3) = ', data(offset + 3)
END FUNCTION FORTRANFUNCTION
Если я начну все это CPPFunction
кажется правильно называется, он вызывает FORTRANFUNCTION
и я получаю код исключения
c0000005 ACCESS_VIOLATION
точно в линию в FORTRANFUNCTION
где осуществляется первый доступ к данным массива.
WRITE(*,*) 'data(offset + 1) = ', data(offset + 1)
Может кто-нибудь сказать мне, где моя ошибка? Следует также отметить, что функция C ++ не моя. Это не невозможно изменить, но это повлияет на множество другого кода. Часть Фортана полностью под моим контролем, и я могу делать с ней все, что захочу.
Спасибо.
Задача ещё не решена.