我是一名理论物理研究生,从事宇宙学研究。在我的研究过程中,我使用了相当大的Fortran代码库,我使用C来满足我的编程需要。
我已经能够在无数的测试文件中链接这两个程序,它们工作得非常出色。但对于它们,我一直使用对象文件将它们全部链接起来。但是,当我尝试通过C运行真正的事务时,会包含对Fortran头文件的引用。它们似乎可以很好地集成和调用彼此,但是Fortran头文件的格式与C编译器不兼容,所以当它跳转到头文件时,它会开始抛出错误,因为它不能理解语法。
例如,Fortran头文件使用real*8定义了双变量,因此当C读取它们时,它会抛出错误。同样的情况也发生在文件中的注释上。
那么,我想问一下,有什么方法可以解决这个问题吗?即通过C使fortran格式的头文件可读。
我浏览了互联网,发现了令人困惑的答案,我不知道该遵循哪一个。在这件事上的任何帮助都将受到感谢:)
发布于 2011-10-13 02:10:24
对不起,你太让人迷惑了。什么是Fortran头文件?例如,您不能使用C编译器读取Fortran包含文件!这两种语言太不一样了。此外,Fortran包含文件几乎永远不是可与C的头文件相比的头文件。
我不知道您使用的是哪种编译器。但是如果你选择了最新的版本(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);
...
}发布于 2011-10-13 01:10:59
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*8Fortran函数必须在C调用函数的开头声明:
extern void read_(int *small, float *medium, double *large);注意,我们必须将所有的变量作为指针传递给。尽管函数名在Fortran中不区分大小写,但在C声明和调用它时,它会获得下划线:
read_(&small, &medium, &large);Fortran函数按如下方式接收变量:
SUBROUTINE READ(small,medium,large)
INTEGER small
REAL medium
DOUBLE large这些变量的精确大小取决于您的系统架构(32位与64位),因此您需要在您的系统上确认C和Fortran中整数、浮点数和双精度数之间的对应关系。
https://stackoverflow.com/questions/7743801
复制相似问题