【问题标题】:C-Fortran Mixed ProgrammingC-Fortran 混合编程
【发布时间】:2011-10-31 12:31:53
【问题描述】:

我正在做一个项目,我必须在 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 对象文件,因此我使用 gfortran 编译 C 文件。如果我改用 GNU C 编译器,它会抛出关于无法识别 gfortran 例程的错误。这也可能是问题的根源,可能是 gfortran 无法识别 C 中的长双精度数。

任何帮助都会很有用。

【问题讨论】:

  • 我不确定long double。在我的(有限)经验中,C double 对应于 Fortran 的 real*8。而complex*16本质上是一对real*8-s。您是否尝试过使用只有 real*8-s 的公共块制作玩具 Fortran 代码?
  • 是的,我做到了。我使用的算法适用于这种情况。但对我来说不是。
  • 那么,如果您只使用double,而不是long double,它会变得更好吗?而且,呃,没有任何一个错误的机会吗? --- Fortran 代码通常使用基于 1 的数组,而不是基于 0 的数组。

标签: c fortran mixed fortran-common-block


【解决方案1】:

为了混合 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 链接是最容易的。 (或使用其他“品牌”编译器。)

【讨论】:

  • 谢谢。我是 Fortran 新手。你能指导我如何使用这个模块吗?
  • “因为我必须混合 Fortran 对象文件,所以我使用 gfortran 来编译 C 文件。”不是很懂,能具体说一下吗?
  • 意味着当我编译我的 C 代码时,它必须包含一些用 GFortran 编译的目标文件。如果我不使用 GFortran 编译器,我会收到错误,因为 CC 编译器无法识别 GFortran 过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2015-12-07
  • 2013-03-30
相关资源
最近更新 更多