[TOC]
概述
笔者最近接手一个用Fortran90、C、Python语言混合编程的项目,借着这个机会,将Fortran与C、C++混合编程的基础知识在做一个回顾。
简单示例
先给出一个简单的实例,让读者对Fotran和C互相调用有一个基本的认识。
Fortran调用C
分别建立Fortran和C文件,并编写如下的内容。
testF.f90如下:
program test
integer ii, jj, kk
common /ijk/ ii, jj, kk
real*8 ff
character*32 cc
ii = 2
jj = 3
kk = 4
ff = 9.0567
cc = 'Example of a character string'
write(6, 10) ii, ff
10 format('ii= ', i2, ' ff= ', f10.4)
call abc(ii)
write(6, 20) ii
20 format('ii= ', i2)
write(6, 30) ii, jj, kk
call doubleIJK(cc)
write(6, 30) ii, jj, kk
30 format('ii= ', i2, ' jj= ', i2, ' kk= ', i2)
write(6, 40) cc
40 format(a32)
stop
end program test
subroutine abc(jj)
jj = jj * 2
return
end subroutine abc
testC.c文件如下:
#include <stdio.h>
extern struct
{
int ii, jj, kk;
} ijk_;
int doubleijk_(char *cc, int ll)
{
cc[ll - 1] = '\0'; // NULL terminate the string
printf("From doubleIJK: %s\n", cc);
ijk_.ii *= 2;
ijk_.jj *= 2;
ijk_.kk *= 2;
return 1;
}
编写完成之后,在命令行执行:
gfortran -c testF.f90
gcc -c testC.c
gfortran -o testF.o testC.o
./test
得到运行结果如下:
ii= 2 ff= 9.0567
ii= 4
ii= 4 jj= 3 kk= 4
From doubleIJK: Example of a character string
ii= 8 jj= 6 kk= 8
Example of a character string
上述文件中,Fortran文件调用了C文件中的函数。
C调用Fortran
testF.f90文件
subroutine fortfun(ii, ff)
integer ii
real*4 ff
write(6, 100) ii, ff
100 format('ii= ', i2, ' ff= ', f6.3)
return
end subroutine fortfun
testC.cpp文件
#include <iostream>
extern "C"
{
void fortfun_(int *ii, float *ff);
}
int main(int argc, char *argv[])
{
int ii = 5;
float ff = 5.5;
fortfun_(&ii, &ff); // 调用fortran程序时只能传址
return 0;
}
编写完成之后,在命令行执行:
gfortran -c testF.f90
g++ -c testC.cpp
g++ -o testF.o testC.o -lgfortran
./test
得到运行结果如下:
ii= 5 ff= 5.500
上述文件中,C++文件调用了fortran文件中的子程序。