我在 Fortran 和 C“master”中有以下代码。它提供了 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 部分的行
编辑:我已将 "integer*8" 改回 "integer" 并改do i=1,10
回do i=1,5
. 对于这个版本,问题仍然有效
i=1 和 j=1 时出现 SIGSEGV