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