Fortran-C-CPP混合编程-1

[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 

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 

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文件中的子程序。

你可能感兴趣的:(Fortran-C-CPP混合编程-1)