混合编程Fortran和C.

时间:2011-10-12 17:06:07

标签: c fortran mixed fortran-iso-c-binding

我是理论物理研究专业的学生,​​从事宇宙学研究。在我的研究过程中,我使用了相当庞大的Fortran代码库,我使用C来满足编程需求。

我已经能够在众多测试文件中链接这两个程序,并且它们的工作非常出色。但对于他们来说,我一直在使用目标文件将它们全部链接起来。但是当我尝试通过C运行真实交易时,请包含对Fortran头文件的引用。它们似乎集成并相互调用,但Fortran头文件的格式与C编译器不兼容,因此当它跳转到头文件时,它会开始抛出无法理解语法的错误。

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

所以,我想问一下,有什么方法可以解决这个问题吗?即使Fortran格式头文件可以通过C读取。

我查看了互联网,发现了令人困惑的答案,我不知道应该遵循哪一个。任何有关此事的帮助将不胜感激:)

2 个答案:

答案 0 :(得分:7)

抱歉,你很困惑。什么是Fortran头文件?例如,您无法使用C编译器读取Fortran包含文件!这两种语言太不同了。另外,Fortran包含文件几乎从不是与C的文件相当的头文件。

我不知道您使用的编译器类型。但是如果你选择了最近的GCC版本(Gnu编译器集合),那么里面包含的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);
  ...
}

答案 1 :(得分: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

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

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中的int,float和double之间的对应关系。