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++,但如果是这样,我也不知道该怎么做.
如果要在C和Fortran之间共享全局变量,最好的方法是使用模块变量和Fortran ISO_C_Binding.公共块是遗留物,除非是遗留代码的一部分,否则最好避免使用.使用ISO_C_Binding将使您的代码编译器和平台无关.在gfortran手册的"混合语言编程"一章的"可互操作的全局变量"小节中有一个代码示例.这不是gfortran特有的,只是一些好的文档.
继续使用ISO_C_Binding,如果使用它提供的Fortran类型,将确保与C类型匹配.相当于C的int的Fortran 是C_INT.列表出现在gfortran手册的"内在模块"一章中.