Fortran と C の「マスター」を使用した次のコードがあります。sigsegv が表示されますが、その理由がわかりません。マスター C プログラムからポインターを取得し、それを Fortran ポインター形式に変換し、C ポインターが指していたデータを読み取ることになっています。特別なことは何もありませんが、それでも SigSegv です。これは、Fortran多次元配列との相互運用性の欠如を回避する唯一の方法です...(そう、Cには多次元配列がありません)。
Fortran の部分:
module ret
implicit none
integer, pointer :: a(:,:)
end module ret
module func
implicit none
contains
subroutine initialize(cp) bind(c,name='initialize')
use ret
use iso_c_binding
implicit none
type(c_ptr) :: cp
call c_f_pointer(cp,a,[5,5])
end subroutine initialize
subroutine printa bind(c,name='printa')
use ret
implicit none
integer :: i,j
do i=1,5
do j=1,5
print *,i,j,a(i,j)
end do
end do
end subroutine printa
end module func
C パート:
#include<stdio.h>
void initialize( void *);
void printa();
int main()
{
int *tab;
tab = (int *)malloc(25 * sizeof (int *));
int i;
for(i=0;i<25;++i)
tab[i]=i;
initialize(tab);
printa();
printf("ok\n");
return 0;
}
SIGSEGV はprint *,i,j,a(i,j)
、Fortran 部分の行で発生します。
編集:「整数* 8」を「整数」にdo i=1,10
戻し、に戻しましたdo i=1,5
。このバージョンでは、質問はまだ有効です
SIGSEGV は i=1、j=1 の場合に表示されます