7

私は大まかに次のような状況にあります。Fortran コードから呼び出され、関数ポインターと void ポインターをこのような引数として取る 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);
  // ...
}

これは 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