我正在开发一个项目,我必须在C中使用Fortran库。在Fortran库中有一个包含复杂* 16,4x4数组的公共块。现在在C中,复杂变量只是一个包含两个元素的结构,因为它是复杂的* 16,元素应该是long double,这是Fortran中相应的C数据类型。所以我有一个带有两个长双打的结构。
我要访问此数组的元素。好的是,我已经可以和库的所有其他常见变量一起做了。问题是我从数组导入的元素是
1)不按照应该的顺序,“即使考虑到C和Fotran 的数组结构的差异”。
2)虽然大多数元素是正确的,但两个元素与它们应该是非常不同的。
3)只有当我使用double而不是long double时才会得到正确的元素(除了两个)。当我使用long double(以及正确的字符转换)时,我会得到完全不同的东西,这清楚地指出了转换的问题。
我已经用尽了所有的解释但没有任何作用。我在C中引用数组的代码如下:
for (j=0;j<=3;j++){
printf("%s", "\n");
for(k=0;k<=3;k++){
printf("%s %d %s %d %s %s %LE %s %LE %s",
"(", k+1, "," ,j+1, ")", "{",
(long double)mssmmixing_.neunmx[k][j].dr,
" ",
(long double)mssmmixing_.neunmx[k][j].di,
"}\n");
}
}
附加信息:由于我必须混合Fortran Object文件,我使用gfortran来编译C文件。如果我使用GNU C编译器,它会抛出有关无法识别gfortran例程的错误。这可能也是问题的根源,可能是gfortran不承认C中的长双打。
任何帮助都会有用。
答案 0 :(得分:2)
为了混合Fortran和C,我建议使用ISO_C_Binding。它甚至有一个与C类型long double _Complex匹配的Fortran类型C_LONG_DOUBLE_COMPLEX - 请参阅http://gcc.gnu.org/onlinedocs/gfortran/ISO_005fC_005fBINDING.html。作为Fortran语言标准的一部分,这些类型保证匹配(当您使用兼容的编译器时)。很可能C_LONG_DOUBLE_COMPLEX实际上与complex * 16相同,但您可以尝试在Fortran中,在内存布局不同的情况下在两种类型之间进行复制。您应该使用gfortran编译Fortran源文件,使用gcc编译C语言。最简单的方法是与gfortran联系。 (或使用其他“品牌”编译器。)