如何实现在C中调用fortran程序,传递多维数组

如何实现在C中调用fortran程序,传递多维数组,第1张

fortran主、子程卜稿段序的数组型誉传递按传址方式。下面是求逆矩阵程序,供参考。c 求逆矩阵c 在主程序中,设两个数组a(5,5),b(5,5)c a(5,5)--存放5阶方阵c b(5,5)--存放单位敬咐阵c 在子程序中,设一个数组c(5,10),该数组是a、b阵拼接起来的c 要实现数组的拼接和拆分,用公用语句实现real a(5,5),b(5,5)common /x/a,bdo 10 i=1,5do 10 j=1,5if (i.eq.j) thenb(i,j)=1elseb(i,j)=0endif10 continuecall inversewrite(*,20)bwrite(*,*)write(*,20)((b(i,j),j=1,5),i=1,5)20 format(1x,5f10.3)c read(*,*) endc ************************************subroutine inversereal c(5,10)common /x/cdo 10 k=1,5do 20 j=10,k,-120 c(k,j)=c(k,j)/c(k,k)do 40 i=1,5if (i.ne.k) thendo 30 j=10,k,-130 c(i,j)=c(i,j)-c(i,k)*c(k,j)endif40 continue10 continueendc ******************************block datareal a(5,5),b(5,5)common /x/a,bdata a/3,1,0,2,10,-2,0,1,3,1,9,3,1,0,1, 1 1,0,1,1,0,1,2,0,2,10/end

fortran的二维数组是按列存放的余帆(即固定右边竖首雹的下标芹纤,让左边的下标先循环)。三维数组类似。

所以在传递数组时(特别是通过公用语句传递时)应注意这一特点 !!!

Module www_fcode_cn

  Implicit None

  TYPE LA

    REAL :: X

    REAL :: Y

  END TYPE LA

End Module www_fcode_cn

  

PROGRAM SUBTRY

  use www_fcode_cn

  REAL :: A(2,2),B(2,2)

  TYPE (LA), DIMENSION(3) :: ST

  CALL ADD(A,B,ST)

  WRITE(*,*) ST(3)%X

END PROGRAM SUBTRY

SUBROUTINE ADD(C,D,MB)

  use www_fcode_cn

  TYPE (LA), DIMENSION(3) :: MB

  REAL :: C(2,2),D(2,2)

  C(1,1)=1

  D(1,1)=3

  MB(3)%X=10

  RETURN

END

虽然主程序和子程序中的 LA 定义得完全一样,但是编译器依然认为是两种不同的 type。

同样都叫橡喊 LA 并不能说明这两种 type 是相同的。而 Type 的成员 A B 是否一样,目前的编侍如正译器都不老悔会去检查。

你需要使用一个 module 来定义 Type LA,然后在主程序和子程序里使用这个 module,这样编译器才会认为是同一个 LA


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12548863.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存