1

我是一名理论物理学研究生,在宇宙学工作。在我的研究过程中,我使用了相当庞大的 Fortran 代码库,并且我使用 C 来满足我的编程需求。

我已经能够在许多测试文件中链接这两个程序,它们运行良好。但对他们来说,我一直在使用目标文件来链接它们。但是当我试图通过 C 运行真正的交易时,包括对 Fortran 头文件的引用。它们似乎可以很好地集成和相互调用,但是 Fortran 头文件的格式与 C 编译器不兼容,因此当它跳转到头文件时,它开始抛出无法理解语法的错误。

例如,Fortran 头文件使用 real*8 定义双变量,因此当 C 读取它们时会引发错误。文件中的注释也是如此。

所以,我想问有没有什么办法可以解决这个问题?即通过C使fortran格式的头文件可读。

我浏览了互联网,发现了令人困惑的答案,我不知道该遵循哪一个。对此问题的任何帮助将不胜感激:)

4

2 回答 2

7

对不起,但你很困惑。什么是 Fortran 头文件?例如,您无法使用 C 编译器读取 Fortran 包含文件!两种语言差别太大。此外,Fortran 包含文件几乎从来都不是与 C 相比的头文件。

我不知道您使用的是哪种编译器。但是如果您选择了最新的 GCC 版本(Gnu Compiler Collection),那么其中包含的 Fortran 编译器能够考虑 ISO_C_BINDING 特性,这使得耦合 Fortran-C 更加容易。

例子 :

MODULE my_fortran
  USE iso_c_binding
  IMPLICIT NONE
  CONTAINS
  SUBROUTINE my_subroutine(a,b) BIND(C,name="my_sub")
    INTEGER(c_int),INTENT(in),VALUE :: a
    REAL(C_DOUBLE),INTENT(out) :: b
    ...
  END SUBROUTINE
END MODULE

例如,名为“my_sub.h”的 C 头文件:

void my_sub(int, double *);

C 文件

#include "my_sub.h"

int main(){
  double b;
  int a=3;
  my_sub(a,&b);
  ...
}
于 2011-10-12T18:10:24.193 回答
4

Fortran 通常通过引用传递其变量(传递指针)。这意味着您必须在调用 C 程序中提供地址。

函数结果,可以按值传递,例如,下面的代码调用了一个名为“gamma”的 FORTRAN 函数:

double   x, y;
   ..................
   x = 2.0; 
   y = gamma_(&x) 

确保调用程序中变量的大小与 Fortran 例程中的大小相同:

float  --- REAL     (this is typical, but not always the case)
double --- REAL*8

Fortran 函数必须在 C 调用函数的开头声明:

extern void read_(int *small, float *medium, double *large);

请注意,我们必须将所有变量作为指针传递给 Fortran。虽然函数名在 Fortran 中不区分大小写,但它在 C 声明中以及在调用时会增加一个下划线:

 read_(&small, &medium, &large);

Fortran 函数接收变量如下:

SUBROUTINE READ(small,medium,large)

  INTEGER       small
  REAL          medium
  DOUBLE        large

这些变量的精确大小取决于您的系统架构(32 位与 64 位),因此您需要在系统上确认 C 和 Fortran 中的整数、浮点数和双精度数之间的对应关系。

于 2011-10-12T17:10:58.960 回答