第 11 章 C-Fortran 接口 (Sun Studio 12:Fortran 编程指南) (oracle.com)
此文详细介绍了不同数据类型的声明和调用方法。请注意不同编译器的实现不同。
通常,fortran例程按引用传递参数。而c通常按值传递参数。在fortran和c之间传递数据的标准方法是按引用传递。对于c,fortran的子程序或函数就像是一个所有参数都用指针表示的过程调用。例如:
int i=100;
float r;
extern void fsim_(int *i, float *r);
fsim_(&i, &r);
...
------------------------------
subroutine FSim(i,r)
integer i
real r
r = i
return
end
fortran和c的数组索引和顺序不同。c数组总是从0开始,而fortran数组在缺省情况下是从1开始。因此,fortran数组元素B(2)等于c数组的b[1]。fortran数组按列主元存储,例如A(3,2)存储为:
A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2)
而c数组为行主元,存储为:
A[0][0] A[0][1] A[1][0] A[1][1] A[2][0] A[2][1]
因此,对于多维数组,在数组操作时需要特别注意。例如,在c中进行部分矩阵操作,而后在fortran中完成剩余部分,这样做会产生混淆。最好是在一种语言中完成所有矩阵操作。
数组定义和访问的方法
extern void
qref_( int[][10], int *);
...
int m[20][10] = ... ;
int sum;
...
qref_( m, &sum );
...
------------------------------
SUBROUTINE QREF(A,TOTAL)
INTEGER A(10,20), TOTAL
DO I = 1,10
DO J = 1,20
TOTAL = TOTAL + A(I,J)
END DO
END DO
...
从c/c++访问fortran中定义的common块
例如,fortran中有如下定义的common块
real a1(100), b1(100)
integer i1,i2
common block / a1, b1, i1, i2 /
在c中访问的方法为:
struct blocktype
{
float a1[100];
float b1[100];
int i1;
int i2;
}
extern "C" blocktype block;
注意不同的编译器实现不同。比如,vs2019和intel compiler 2021,用编译器的默认选项,上面的block和变量名都要大写,即使fortran中是小写。
而有的编译器要求c中的定义block要后面加下划线,block_。
另外,数据类型一定要对应,否则虽然能够运行,但结果明显不对。