混合编程Fortran和C.
我是理论物理研究专业的学生,从事宇宙学研究。 在我的研究过程中,我使用了相当庞大的Fortran代码库,并使用C来满足我的编程需求。
我已经能够在众多测试文件中链接这两个程序,并且它们的工作非常出色。 但对于他们来说,我一直在使用目标文件将它们全部链接起来。 但是当我尝试通过C运行真正的交易时,包括对Fortran头文件的引用。 它们似乎集成并相互调用,但Fortran头文件的格式与C编译器不兼容,因此当它跳转到头文件时,它会开始抛出无法理解语法的错误。
例如,Fortran头文件使用real * 8定义双变量,因此当C读取它们时会抛出错误。 文件中的注释也是如此。
所以,我想问一下,有什么方法可以解决这个问题吗? 即通过C使fortran格式头文件可读。
我查看了互联网,发现了令人困惑的答案,我不知道应该遵循哪一个。 任何有关此事的帮助将不胜感激:)
对不起,你很困惑。 什么是Fortran头文件? 例如,您无法使用C编译器读取Fortran包含文件! 这两种语言太不同了。 此外,Fortran包含文件几乎从不是与C的文件相媲美的头文件。
我不知道你使用的那种编译器。 但是如果您选择了最近的GCC版本(Gnu编译器集合),那么内部包含的Fortran编译器就能够考虑到ISO_C_BINDINGfunction,这使得耦合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); ... }
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中的整数,浮点数和双精度数之间的对应关系。