Fortran与CC++混合编程⽰例
以下例⼦均来⾃⽹络,只是稍作了编辑,⽅便今后查阅。
⼦⽬录
(⼀) Fortran调⽤C语⾔
(⼆) C语⾔调⽤Fortran
(三) C++ 调⽤Fortran
(四) Fortran 调⽤ C++
需要说明的是,(⼀)和(⼆)对GCC编译器的版本要求并不⾼;⽽(三)和(四)对GCC编译器的要求⽐较⾼,需要GCC在4.7及以上才能编译通过,这是由于⾃Fortran 2003⼀代语⾔起,增加了⼀个名为“iso_c_binding”的模块,可以很⽅便地在Fortran和C++之间传递参数,简化了两者的混合编程。
————————————————————我是分割线———————————————————————————————
(⼀) Fortran调⽤C语⾔
源程序来⾃,增加了⼀个⼆维数组类型的调⽤⽰例。
Fortran⽂件(main.f90)的内容如下:
implicit none
interface
subroutine sub_c(n1,n2,n3) integer :: n1
real :: n2
real(8) :: n3
end subroutine
real(8) function func_d(var2d) real(8) :: var2d(2,3)
end function
real(8) function func_c(n3)
real(8) :: n3
end function
end interface
integer :: n1
real :: n2
real(8) :: n3,n4
real(8) :: var2d(2,3)
n1=3
n2=5.0
call sub_c(n1,n2,n3)
n4=func_c(n3)
write(*,*) "n1=",n1
write(*,*) "n2=",n2
write(*,*) "n3=",n3
write(*,*) "n4=",n4
var2d=0
var2d(1,1)=dble(n1)
var2d(1,2)=dble(n2)
write(*,*) "var2d(1,:): ",var2d(1,:) write(*,*) "var2d(2,:): ",var2d(2,:) n2=func_d(var2d)
write(*,*) "var2d(1,:): ",var2d(1,:) write(*,*) "var2d(2,:): ",var2d(2,:)
end program main
C⽂件(sub.c)的内容如下:
#include <stdio.h>
void sub_c_(int *,float *,double *);
double func_c_(double *);
double func_d_(double [][2]);
void sub_c_(int *n1,float *n2,double *n3)
{
*n3=pow(*n2,*n1);
}
double func_c_(double *n3)
{
double n4;
n4=sqrt(*n3);
return n4;
}
double func_d_(double var2d[3][2])
{
double NN;
NN=77.0;
printf("%5.2f %5.2f %5.2f \n",var2d[0][0],var2d[1][0],var2d[2][0]); printf("%5.2f %5.2f %5.2f \n",var2d[0][1],var2d[1][1],var2d[2][1]); var2d[1][0]=NN;
printf("%5.2f %5.2f %5.2f \n",var2d[0][0],var2d[1][0],var2d[2][0]); printf("%5.2f %5.2f %5.2f \n",var2d[0][1],var2d[1][1],var2d[2][1]);
return NN;
}
Makefile ⽂件的内容如下:
all:
gcc -c sub.c -o sub.o
gfortran -c main.f90 -o main.o
gfortran - main.o sub.o
clean:
rm *.o *.exe
编译并运⾏的结果如下:
[She@she-centos7 TestABC]$ make
gcc -c sub.c -o sub.o
gfortran -c main.f90 -o main.o
gfortran - main.o sub.o
[She@she-centos7 TestABC]$ ./
n1= 3
n2= 5.00000000
n3= 125.00000000000000
n4= 11.180339887498949
var2d(1,:): 3.0000000000000000 5.00000000000000000.0000000000000000
var2d(2,:): 0.00000000000000000.00000000000000000.0000000000000000
3.005.000.00
0.000.000.00
3.0077.000.00
0.000.000.00
var2d(1,:): 3.000000000000000077.0000000000000000.0000000000000000
var2d(2,:): 0.00000000000000000.00000000000000000.0000000000000000
注意:⼆维数组在Fortran和C中存储的⽅式不同,Fortran中是“列优先”,⽽C中是“⾏优先”。
在参数传递时,容易导致两者的引⽤错误。使⽤时要务必注意这个区别
(⼆) C语⾔调⽤Fortran
⽰例1.
这种⽅法不需要对函数体进⾏预先声明,直接引⽤即可。由于结构体本⾝的最⼩存储单元的限制,在结构体内部的数据类型最好先作优化,以节省内存开销,原理可参见。
c2fortran.c
#include <string.h>
struct test{
int n;
float m;
};
/* c2fortran.c */
int main(int argc,char *argv[])
{
struct test t;
t.n=90;
t.m=0.003;
int i;
float e = 2.71828;
char hello[32];
int length = sizeof(hello);
strcpy(hello,"Hello Fortran from C");
for(i=strlen(hello); i<length; i++)
hello[i] = '';
showhie_(hello,&length,&e,&t);
return(0);
}
showhie.f
C showhie.f
C
SUBROUTINE SHOWHIE(HELLO,LENGTH,E,T)
CHARACTER*(*) HELLO
INTEGER LENGTH
REAL E
TYPE TEST
INTEGER N
REAL M
END TYPE
TYPE (TEST) :: T
C
WRITE(*,100) HELLO(1:LENGTH),LENGTH,E,T%N,T%M 100 FORMAT(3X,A,2X,I3,4X,F7.5,2X,I3,2X,F7.5)
gnu编译器RETURN
END SUBROUTINE SHOWHIE
Makefile_test 的内容:
fortran2c : c2fortran.o showhie.o
gfortran c2fortran.o showhie.o -o c2fortran
showhie.o : showhie.f
gfortran -c showhie.f -o showhie.o
c2fortran.o : c2fortran.c
gcc -c c2fortran.c -o c2fortran.o
clean :
rm *.o
编译并运⾏的结果如下:
[She@she-centos7 TestABC]$ make -f Makefile_test
gcc -c c2fortran.c -o c2fortran.o
gfortran -c showhie.f -o showhie.o
gfortran c2fortran.o showhie.o -o c2fortran
[She@she-centos7 TestABC]$ ./c2fortran
Hello Fortran from C 32 2.71828900.00300
⽰例2.
main.c
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论