C-Fortran混合编程

C-Fortran混合编程,c,fortran,mixed,fortran-common-block,C,Fortran,Mixed,Fortran Common Block,我正在从事一个项目,在这个项目中,我必须使用C语言中的Fortran库。在Fortran库中,有一个包含复杂*16,4x4数组的公共块。现在在C中,一个复数变量只是一个包含两个元素的结构,因为它是复数*16,所以元素应该是长双精度的,这是Fortran中对应的C数据类型。所以我有一个有两个长双精度的结构 我将访问此数组的元素。好的是,我已经可以和库中所有其他公共变量一起使用了。问题是我从数组中导入的元素 1) 而不是按照应该的顺序,“即使在考虑了C和Fotran的数组结构差异后也不例外。” 2)

我正在从事一个项目,在这个项目中,我必须使用C语言中的Fortran库。在Fortran库中,有一个包含复杂*16,4x4数组的公共块。现在在C中,一个复数变量只是一个包含两个元素的结构,因为它是复数*16,所以元素应该是长双精度的,这是Fortran中对应的C数据类型。所以我有一个有两个长双精度的结构

我将访问此数组的元素。好的是,我已经可以和库中所有其他公共变量一起使用了。问题是我从数组中导入的元素

1) 而不是按照应该的顺序,“即使在考虑了C和Fotran的数组结构差异后也不例外。”

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

3) 只有当我使用double而不是longdouble时,我才能得到正确的元素(除了两个)。当我使用长双精度(以及正确的字符转换)时,我得到了完全不同的结果,这清楚地表明转换存在问题

我已经用尽了我所有的解释,但没有任何效果。我用C编写的priting数组代码如下:

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");           
    }
}

对于(j=0;j对于混合使用Fortran和C,我建议使用ISO_C_绑定。它甚至有一个Fortran类型C_LONG_DOUBLE_复合体,与C类型LONG DOUBLE_复合体匹配——请参阅。作为Fortran语言标准的一部分,这些类型保证匹配(当您使用兼容的编译器时)。很可能C_LONG_DOUBLE_COMPLEX实际上与COMPLEX*16相同,但在Fortran中,您可以尝试在这两种类型之间进行复制,以防内存布局不同。您应该使用gfortran编译Fortran源文件,使用gcc编译C源文件。最容易与gfortran链接。(或使用其他“品牌”编译器。)

谢谢。我是Fortran新手。你能给我介绍一下如何使用这个模块吗。“因为我必须混合使用Fortran对象文件,所以我使用gfortran来编译C文件。”我真的不明白,你能指定它吗?这意味着当我编译我的C代码时,它必须包含一些在GFortran中编译的对象文件。如果我不使用GFortran编译器,我会出错,因为CC编译器无法识别GFortran过程。我不确定我的(有限)中是否有
long double
体验C
double
对应于Fortran的
real*8
complex*16
本质上是一对
real*8
-s。你有没有尝试过用一个只有
real*8
-s的公共块来制作一个玩具Fortran代码?是的,我有。我使用的算法适用于这种情况。但在我的情况下不行。那么,它有什么用处吗如果你只使用双精度,而不使用长双精度,并且,呃,不可能出现一个接一个的错误??Fortran代码通常使用基于1的数组而不是基于0的数组。