Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+;Fortran为什么是sigsegv?_C_Interop_Fortran_Fortran2003_Fortran Iso C Binding - Fatal编程技术网

C+;Fortran为什么是sigsegv?

C+;Fortran为什么是sigsegv?,c,interop,fortran,fortran2003,fortran-iso-c-binding,C,Interop,Fortran,Fortran2003,Fortran Iso C Binding,我用Fortran和C“master”编写了以下代码。它给出了sigsegv,但我不明白为什么。它应该从主C程序中获取一个指针,将其转换为Fortran指针格式,并读取C指针指向的数据。没什么特别的,但还是一辆西格夫。顺便说一句,这是我看到的避免Fortran多维数组与…缺乏互操作性的唯一方法。。。(是的,C没有多维数组) Fortran部分: module ret implicit none integer, pointer :: a(:,:) end module ret

我用Fortran和C“master”编写了以下代码。它给出了sigsegv,但我不明白为什么。它应该从主C程序中获取一个指针,将其转换为Fortran指针格式,并读取C指针指向的数据。没什么特别的,但还是一辆西格夫。顺便说一句,这是我看到的避免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;
 }
#包括
作废初始化(作废*);
void printa();
int main()
{    
int*选项卡;
tab=(int*)malloc(25*sizeof(int*);
int i;

对于(i=0;i我添加这个作为一个答案,以防其他人带着类似于您的问题来到这里

显示的代码中有两个问题。首先,正如Klas Lindbäck所指出的,您正在为整数指针分配内存。这不是问题的根源,因为指针的大小至少为int或更大,但无论如何,应该向
sizeof
操作符提供正确的数据类型,以便防止过度使用现有资源

第二个问题是Fortran中的参数是通过引用传递的。这意味着,当从C调用Fortran例程时,应使用运算符
&
的地址。常量也应放在单独的常量变量中,并通过地址传递。纠正前一个问题后,C代码应为:

tab = malloc(25 * sizeof (int)); // int instead of int *
int i;
for(i = 0; i < 25; ++i)
  tab[i] = i;
initialize(&tab);                // pass tab by address

如果你这样做,你就不需要通过引用来传递
tab

integer*8
是64位宽,
int
通常是32位宽。此外
printa
不带参数,但是你传递了一个参数。实际上,最初我没有“*8”部分。我后来添加了它。症状与没有“*8”完全相同您有
do i=1,10;do j=1,5
(50个元素),而与
a
关联的存储仅包含25个元素。抱歉,我发布了错误的代码,但即使更改为5,也有一个sigsegv。它出现在i=1,j=1这可能是一个提示,但我不理解输出:断点1,FUNC::initialize(cp=…)在Fort.F90:17调用c_f_指针(cp,a,[5,5])(gdb)打印cp$3=(参考->(类型c_ptr整数(8)::ptr结束类型c_ptr))@0x100000000:
type(c_ptr), value :: cp