Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73842
  • 博文数量: 26
  • 博客积分: 1070
  • 博客等级: 少尉
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-27 09:32
文章分类

全部博文(26)

文章存档

2011年(1)

2010年(3)

2009年(22)

我的朋友

分类: 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

阅读(3307) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~