7

我大致有以下情况。我有一个从 Fortran 代码调用的 C++ 函数,它接受一个函数指针和一个 void 指针作为这样的参数

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);
  // ...
}

这是像这样从 Fortran 调用的

! ...
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++ 函数不是我的。更改它并非不可能,但它会影响许多其他代码。Fortan 部分完全在我的控制之下,我可以用它做我想做的事。

谢谢你。

4

0 回答 0