2

this this question から ISO_C_BINDING にコードを変更しようとしましたが、C_F_POINTER 呼び出しにより未定義のポインター/配列 (VS2010 デバッガー) が発生し、print*, f_arr(i)セグメンテーション違反がトリガーされます。array interop の指示に厳密に従っていると思います。

main.c

extern void subr(int, float*);
int main(int argc, char **argv){
    int N = 3;
    int i;
    float data[3];
    for (i=0;i<N;i++) data[i]=i;
    subr(N,data);
}

sub.f90

subroutine subr(n, c_arr) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING 
implicit none

INTEGER(C_INT),VALUE :: n
TYPE (C_PTR) :: c_arr
REAL(C_FLOAT), POINTER :: f_arr (:)
integer :: i,ml,mu

CALL C_F_POINTER (c_arr, f_arr, (/n/) )
ml = lbound(f_arr,1)
mu = ubound(f_arr,1)

do i=ml,mu
  print*, f_arr(i)
enddo
end subroutine

ポインター変換で失敗する理由を知っていますか? (インテル Fortran コンパイラ)

4

1 に答える 1