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 コンパイラ)