C++和Fortran:从C++访问Fortran公共块中的数组时出错

hor*_*ann 2 c++ integration fortran fortran-common-block

我正在尝试从C++访问Fortran公共块结构中的数组.
我有一个混合的示例代码与C++和Fortran.

Fortran语言:

integer a(5),b  
common  /sample/ a,b  
a(1) = 1  
a(2) = 5  
a(3) = 10  
a(4) = 15  
a(5) = 20  
b = 25  
Run Code Online (Sandbox Code Playgroud)

然后在C++中:

extern "C"{  
    extern struct{  
        int *a,b;  
}sample_;  
Run Code Online (Sandbox Code Playgroud)

从C++,如果我尝试打印值sample_.b:

printf("sample b:%d\n",sample_.b);
Run Code Online (Sandbox Code Playgroud)

我得到a(2)的值: sample b:5

如果我尝试打印任何其他数组 - 一个值,我只是得到一个segementation故障...

printf("sample_.a[1]=%d\n",(int)sample_.a[1]);  
printf("sample_.a[0]=%d\n",(int)sample_.a[0]);
Run Code Online (Sandbox Code Playgroud)

我做错了什么?¿任何想法¿?
我想,也许我必须将数组"a"的长度也传递给C++,但如果是这样,我也不知道该怎么做.

M. *_* B. 6

如果要在C和Fortran之间共享全局变量,最好的方法是使用模块变量和Fortran ISO_C_Binding.公共块是遗留物,除非是遗留代码的一部分,否则最好避免使用.使用ISO_C_Binding将使您的代码编译器和平台无关.在gfortran手册的"混合语言编程"一章的"可互操作的全局变量"小节中有一个代码示例.这不是gfortran特有的,只是一些好的文档.

继续使用ISO_C_Binding,如果使用它提供的Fortran类型,将确保与C类型匹配.相当于C的int的Fortran 是C_INT.列表出现在gfortran手册的"内在模块"一章中.

  • 不幸的是,有数百万行的遗留FORTRAN 77代码,并且总是不可能在Fortran 2003中重写它. (2认同)