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/endfortran的二维数组是按列存放的余帆(即固定右边竖首雹的下标芹纤,让左边的下标先循环)。三维数组类似。
所以在传递数组时(特别是通过公用语句传递时)应注意这一特点 !!!
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
评论列表(0条)