C與Fortran之間的相互調(diào)用

字號(hào):

C與Fortran都是應(yīng)用廣泛的語(yǔ)言,由于二者語(yǔ)言特性的不同,應(yīng)用的場(chǎng)合很有差異。C語(yǔ)言通常用于系統(tǒng)軟件和一些應(yīng)用軟件的開發(fā),而Fortran在高性能應(yīng)用領(lǐng)域有很好的應(yīng)用。對(duì)于通常的用戶,接促C語(yǔ)言的較多,但是,C語(yǔ)言的開發(fā)者,有時(shí)還想利用高效的Fortran 數(shù)據(jù)包 或者是Fortran語(yǔ)言的開發(fā)者想借用C提供的強(qiáng)大輔助功能,為此,為了方便大家對(duì)二語(yǔ)言相互調(diào)用的學(xué)習(xí)。這里給出了一些簡(jiǎn)單的入門性技術(shù)介紹。
    1. C 調(diào)用Fortran
    編輯Fortran 源文件 add.f95
    subroutine add(a, b, c)
    implicit none
    real:: a, b, c
    !
    ! the add routine
    ! c = a+b
    !
    c = a + b
    write(*,*) a, ’+’, b, ’=’, c
    return
    end subroutine add
    這里部介紹Fortran的語(yǔ)法格式,add.f95的功能是建立一個(gè)add routine 也就是函數(shù)。
    編譯 add.f95
    f95 -o add.o -c add.f95
    編輯C 主程序main.c
     1 #include
     2
     3 extern void add_(float *a, float *b, float *c);
     4
     5 int main(int argc, char *argvs[])
     6 {
     7 float a, b, c;
     8 a = 5.0;
     9 b = 7.0;
     10 add_(&a, &b, &c);
     11
     12 return 0;
     13 }
    3: 聲明你要調(diào)用的函數(shù),這里注意,是add_,調(diào)用的時(shí)候用指針,即變量地址,你應(yīng)該明白了Fortran的調(diào)用是改變參數(shù)值的。
    10:調(diào)用fortran函數(shù)
    編譯與執(zhí)行
    #gfortran -o main main.c add.o
    #./main
     5.000000 + 7.000000 = 12.00000
    NOTES; if you use the gcc tool, it will generate error
    #gcc -o main main.c add.o
    add.o: In function `add_’:
    add.f95:(.text+0x4c): undefined reference to `_gfortran_st_write’
    add.f95:(.text+0x69): undefined reference to `_gfortran_transfer_real’
    add.f95:(.text+0x87): undefined reference to `_gfortran_transfer_character’
    add.f95:(.text+0xa4): undefined reference to `_gfortran_transfer_real’
    add.f95:(.text+0xc2): undefined reference to `_gfortran_transfer_character’
    add.f95:(.text+0xdf): undefined reference to `_gfortran_transfer_real’
    add.f95:(.text+0xed): undefined reference to `_gfortran_st_write_done’
    collect2: ld returned 1 exit status
    Some Wrong with your PATH for you gcc library
    OK! you are clever and has known how call fortran routines in the C progaram. Next part I show you how to call C routines in the Fortran program!
    2, Fortran 調(diào)用 C 函數(shù)
    編輯C源碼add.c
     1 #include
     2
     3 void add_(float *a, float *b, float *c)
     4 {
     5 *c = *a + *b;
     6 printf("%f + %f = %f\n", *a, *b, *c);
     7 }
    Notes The funtion name "add_"
    編譯源代碼
    # gcc -o add.o -c add.c
    編輯fortran 主程序main.f95,編譯和執(zhí)行
     1 PROGRAM MAIN
     2 implicit none
     3 real:: i, j, k
     4 !
     5 ! The first fortran program
     6 !
     7 i = 5.0
     8 j = 8.0
     9 call add(i, j, k)
     10 stop
     11 end program MAIN
    NOTE 9 line
    # gfortran -o main main.f95 add.o (or f95 -o main main.f95 add.o)
    # ./main
    5.000000 + 8.000000 = 13.000000
    OK. If you reach here, congratulations, you have learned how to call routines between C and fortran!