2

我正在做一个项目,我必须在 C 中使用 Fortran 库。在 Fortran 库中,有一个包含复杂 *16、4x4 数组的公共块。现在在 C 中,复变量只是一个包含两个元素的结构,由于它是复数 *16,因此元素应该是 long double,这是 Fortran 中对应的 C 数据类型。所以我有一个带有两个长双打的结构。

我要访问这个数组的元素。好消息是,我已经可以与库的所有其他常见变量一起执行此操作。问题是我从数组中导入的元素是,

1) 没有按应有的顺序排列,“即使在考虑到 C 和 Fotran 的数组结构的差异之后”。

2)虽然大多数元素是正确的,但有两个与它们应该是完全不同的。

3)只有当我使用双而不是长双时,我才能得到正确的元素(除了两个)。当我使用 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 对象文件,所以我使用 gfortran 来编译 C 文件。如果我改用 GNU C 编译器,它会抛出关于无法识别 gfortran 例程的错误。这也可能是问题的根源,可能是 gfortran 无法识别 C 中的长双精度数。

任何帮助都会很有用。

4

1 回答 1

2

For mixing Fortran and C, I recommend the use of the ISO_C_Binding. It even has a Fortran type C_LONG_DOUBLE_COMPLEX that matches the C type long double _Complex -- see http://gcc.gnu.org/onlinedocs/gfortran/ISO_005fC_005fBINDING.html. As part of the Fortran language standard these types are guaranteed to match (when you use compatible compilers). Very likely C_LONG_DOUBLE_COMPLEX is actually the same as complex*16 but you could try, in Fortran, copying between the two types in case the memory layout is different. You should compile the Fortran source files with gfortran and the C with gcc. It is easiest to link with gfortran. (Or use other "brand" compilers.)

于 2011-10-31T14:30:07.033 回答