在fortran例程中正确的变量定义

时间:2014-03-04 00:43:00

标签: variables fortran

我想运行m * n矩阵在fortran中进行QR分解

PROGRAM SUBDEM 
    INTEGER  key, n, m, loopA
    REAL resq
    REAL A(3,2)     
    REAL B(3)
    REAL X(2) 
    key  = 0
    n    = 2
    m    = 3
    resq = 0   
    CALL QR(m, n, A, B, X, resq) 
END

QR例程是:

subroutine QR(m, n, a, b, x, resq)
     implicit double precision (a-h, o-z)                              
      dimension a(m,n),b(m),x(n)
      double precision sum, dot
      resq=-2.0
      if (m .lt. n) then 
        return
      endif  
      resq=-1.0
!  Loop ending on 1800 rotates  a  into upper triangular form.
      do 1800 j=1, n
!  Find constants for rotation and diagonal entry.
        sq=0.0
        do 1100 i=j, m
          sq=a(i,j)**2 + sq
 1100   continue
        if (sq .eq. 0.0) then 
            return
        endif
        qv1=-sign(sqrt(sq), a(j,j))
        u1=a(j,j) - qv1
        a(j,j)=qv1
        j1=j + 1
! Rotate remaining columns of sub-matrix.
        do 1400 jj=j1, n
          dot=u1*a(j,jj)
          do 1200 i=j1, m
            dot=a(i,jj)*a(i,j) + dot
 1200     continue
          const=dot/abs(qv1*u1)
          do 1300 i=j1, m
            a(i,jj)=a(i,jj) - const*a(i,j)
 1300     continue
          a(j,jj)=a(j,jj) - const*u1
 1400   continue
! Rotate  b  vector.
        dot=u1*b(j)
        do 1600 i=j1, m
          dot=b(i)*a(i,j) + dot
 1600   continue
        const=dot/abs(qv1*u1)
        b(j)=b(j) - const*u1
        do 1700 i=j1, m
          b(i)=b(i) - const*a(i,j)
 1700   continue
 1800 continue
! Solve triangular system by back-substitution.
      do 2200 ii=1, n
        i=n-ii+1
        sum=b(i)
        do 2100 j=i+1, n
          sum=sum - a(i,j)*x(j)
 2100   continue
        if (a(i,i).eq. 0.0) then
            return
        endif
         x(i)=sum/a(i,i)
 2200 continue
! Find residual in overdetermined case.
      resq=0.0
      do 2300 i=n+1, m
        resq=b(i)**2 + resq
 2300 continue
      return
      end  subroutine  

但是我得到了:

  

错误1错误#6633:实际参数的类型与   伪参数的类型。 [A]错误2错误#6633:类型   实际参数与伪参数的类型不同   [B]错误3错误#6633:实际参数的类型不同   从伪参数的类型。 [X]错误4错误#6633:   实际参数的类型与虚拟的类型不同   论点。 [RESQ]

我做错了什么?

1 个答案:

答案 0 :(得分:4)

我将总结@george和@ M.S.B的评论。

过程的伪参数的类型和种类必须与调用代码使用的实际参数匹配。例如,当程序在模块中时,编译器可以在具有显式接口时检查这一点,并且某些编译器也可以为外部过程执行此操作,这是您的情况。

将子程序放在模块中是在所有条件和所有编译器上进行此检查的首选方法。

使用implicit double precision (a-h, o-z),您将名称以a-ho-z开头的所有变量声明为double precision。在主程序中,您使用real来调用该过程。这是错误,类型必须匹配。

强烈建议不要使用除implicit之外的任何其他形式的implicit none,这是每个编译单元(程序,模块,外部程序)开头应该出现的形式