首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran与C混合编程

Fortran与C混合编程
EN

Stack Overflow用户
提问于 2011-10-13 01:06:07
回答 2查看 2.5K关注 0票数 1

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

我已经能够在无数的测试文件中链接这两个程序,它们工作得非常出色。但对于它们,我一直使用对象文件将它们全部链接起来。但是,当我尝试通过C运行真正的事务时,会包含对Fortran头文件的引用。它们似乎可以很好地集成和调用彼此,但是Fortran头文件的格式与C编译器不兼容,所以当它跳转到头文件时,它会开始抛出错误,因为它不能理解语法。

例如,Fortran头文件使用real*8定义了双变量,因此当C读取它们时,它会抛出错误。同样的情况也发生在文件中的注释上。

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

我浏览了互联网,发现了令人困惑的答案,我不知道该遵循哪一个。在这件事上的任何帮助都将受到感谢:)

EN

回答 2

Stack Overflow用户

发布于 2011-10-13 02:10:24

对不起,你太让人迷惑了。什么是Fortran头文件?例如,您不能使用C编译器读取Fortran包含文件!这两种语言太不一样了。此外,Fortran包含文件几乎永远不是可与C的头文件相比的头文件。

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

示例:

代码语言:javascript
复制
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头文件,例如:

代码语言:javascript
复制
void my_sub(int, double *);

C文件

代码语言:javascript
复制
#include "my_sub.h"

int main(){
  double b;
  int a=3;
  my_sub(a,&b);
  ...
}
票数 7
EN

Stack Overflow用户

发布于 2011-10-13 01:10:59

Fortran通常通过引用传递变量(传递指针)。这意味着你必须在你的C程序中给出地址。

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

代码语言:javascript
复制
double   x, y;
   ..................
   x = 2.0; 
   y = gamma_(&x) 

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

代码语言:javascript
复制
float  --- REAL     (this is typical, but not always the case)
double --- REAL*8

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

代码语言:javascript
复制
extern void read_(int *small, float *medium, double *large);

注意,我们必须将所有的变量作为指针传递给。尽管函数名在Fortran中不区分大小写,但在C声明和调用它时,它会获得下划线:

代码语言:javascript
复制
 read_(&small, &medium, &large);

Fortran函数按如下方式接收变量:

代码语言:javascript
复制
SUBROUTINE READ(small,medium,large)

  INTEGER       small
  REAL          medium
  DOUBLE        large

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7743801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档