跳转到内容

Fortran/混合语言

来自维基教科书,开放的书籍,开放的世界

Fortran 类型与其他编译语言中的内建类型很好地匹配。以下是一个 Fortran 到 C 类型的表格

 Fortran            C
 =======            =
 COMMON             extern struct
 INTEGER*1          signed char
 INTEGER*2          short
 INTEGER*4          long
 INTEGER*8          long long
 INTEGER            int
 REAL               float
 REAL*4             float
 REAL*8             double
 REAL*16            long double
 LOGICAL            int
 LOGICAL*n          char [n]
 CHARACTER*n        char [n]
 DOUBLE PRECISION   double
 COMPLEX            float [2]
 COMPLEX*8          float [2]
 COMPLEX*16         double [2]
 COMPLEX*32         long double [2]

Fortran 数组在内存中的布局与 C 和许多基于 C 的语言中的数组形成对比。在 C 中迭代连续的数组元素时,最右边的数组下标变化最快,而在 Fortran 中,最左边的数组下标变化最快。因此,在连续内存中,x(1,1) 之后的元素是 x(2,1),而不是 x(1,2)。此外,C 中的元素下标从 0 开始,而 Fortran 默认从 1 开始。Fortran 中的元素可能是 x(1),而在 C 代码中,等效的值是 x[0]。但是,当将 Fortran 数组传递给 C 函数时,您不需要(也不应该)先将数组重新排列成 C 风格的下标;编译器会自动为您完成此操作。

全局存储

[编辑 | 编辑源代码]

请参阅 公共块 部分。

子程序和函数调用

[编辑 | 编辑源代码]

许多语言将它们的参数推入堆栈,一些作为常量,一些作为地址。在大多数编译器中,Fortran 将编译一个指向变量和常量的指针块,并推入该块的地址。因此,如果我们有一个如下定义的 Fortran 过程

subroutine my_sub(i, j, x)

那么 C 定义将是

struct my_sub_args {
    int *i;
    int *j;
    float *x;
} my_sub_args = {&i, &j, &x};
void my_sub(my_sub_args*);

C 代码可以如下调用该例程

my_sub(&my_sub_args);

PL/1 特殊情况

[编辑 | 编辑源代码]

在 PL/1 中,您可以定义一个外部公共块、子程序或过程为 FORTRAN 类型。当您这样做时,从下标顺序到所有内容都会为您处理。同样,您可以定义一个 PL/1 项目(例如子程序)为 FORTRAN 类型,然后它就可以使用 Fortran 的调用约定由 Fortran 调用。

华夏公益教科书