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!
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!

