分类: LINUX
2009-06-11 10:50:27
C-Fortran混合编程有两种模式:C为主程序或Fortran为主程序。在C为主程序时,只能采用 gcc编译C程序,f77编译Fortran程序,然后用f77连接;但在Fortran为主程序时,可以采用gcc或 pgcc编译C程序,f77或pgf77或pgf90编译Fortran程序,然后采用f77或pgf77或pgf90连接, 连接时用的软件必须与编译Fortran时的一致。
在传递数组时必须注意以下三点:
1. 在C与Fortran中数组存放顺序不同,因此,传送后必须进行转置(见下列程序);
2. 在C中,形参中的数组元素不能采用动态数组,即不能用malloc分配内存(见下列程序);
3. 在C与Fortran中传递的数组大小、类型必须完全相同、对应;
4. 在C中数组元素下标从0开始,而在Fortran中则从1开始。
Fortran为主程序调用C子程序的例子如下:
Fortran主程序:
program test
external get3d
dimension u(12,11,10)
ii=20
x=200.0
call get3d(imax,jmax,kmax,delx,bb,ii,x)
write(*,*) 'in F:', imax,jmax,kmax,delx,ii,x
do k=1,kmax
do j=1,jmax
do i=1,imax
write(*,*) i,j,k,u(k,j,i)
enddo
enddo
enddo
end
=========================================================================================
C子程序:
#include
#include
void get3d_(int *LEN,int *DEP,int *HIG,float *deltaX,float u[12][11][10],int *ii,float *x)
{
int i,j,k;
*LEN=12;
*DEP=11;
*HIG=10;
*deltaX=1.0;
for (k = 0; k < *HIG; k++) {
for (j = 0; j < *DEP; j++) {
for (i = 0; i < *LEN; i++) {
u[i][j][k] = (float)(i+j+k);
printf("in C1: %f\n",u[i][j][k]);
}
}
}
printf("%d %f %d %f\n",*LEN,*DEP,*HIG,*deltaX,*ii,*x);
}
C为主程序调用Fortran子程序的例子如下:
C主程序:
#include
#include
int main()
{
extern void get3d_(int *LEN,float *deltaX,float bb[10],int *j,float *x);
int i,j,LEN;
float x,deltaX,bb[10];
LEN=325;
deltaX = 1.0;
for(i=0;i<10;i++)
{
bb[i]=i;
printf("in C1: %f\n",bb[i]);
}
printf("in C1: %d %f\n",LEN,deltaX);
get3d_(&LEN,&deltaX,bb,&j,&x);
printf("in C2: %d %f %d %f\n",LEN,deltaX,j,x);
for(i=0;i<10;i++)
printf("in C2: %f\n",bb[i]);
}
=========================================================================================
Fortran子程序:
subroutine get3d(imax,delx,bb,j,x)
dimension bb(10)
j=20
x=200.0
do i=1,10
bb(i)=bb(i)+1
enddo
write(*,*) 'in F:', imax,delx,j,x
write(*,*) 'in F:', bb
end