将Common块数组大小传递给Fortran

时间:2016-06-21 22:12:55

标签: arrays fortran subroutine

我想将数组维度作为虚拟变量传递给子例程。数组本身位于Common块中。这是代码:

PROGRAM test
integer i, nn
integer PARAMETER(Nt=10)
real x(Nt), y(nt), z(Nt)
Common /Bdat/ z
nn=Nt
do i=1,Nt
x(i)=i+1
z(i)=i-1
enddo
call estimate(x,y,nn)
print*, y
return
end

subroutine estimate(x,y,jj)
integer i,jj
real x(jj), y(jj), zq(jj)
COMMON /Bdat/ zq
do i=1, jj
y(i)=x(i)+zq(i)
enddo
return
end

这是我从子程序得到的错误:

real x(jj), y(jj), zq(jj)
                      1

错误:变量' jj' at(1)在这种情况下必须是常数

如果有人能帮忙怎么做,我真的很感激。

1 个答案:

答案 0 :(得分:2)

您有范围问题。阅读:Scope in Fortran。也就是说,您的子例程estimate需要访问您需要作为附加参数传递的变量Nt,或者您可以使用contains语句在程序中移动整个子例程。这将允许您的程序成功运行,但我强烈建议您不要使用common块。如果由于遗留代码而无法避免,请参阅:Improve your FORTRAN 77 programs using some Fortran 90 features

尝试使用模块:

    module bdat

      implicit none

      private
      public :: NT, z

      integer, parameter :: NT = 10
      real               :: z(NT) 

    end module bdat

    module my_sub

      use bdat, only: &
           zq => z ! You're free to rename the variable

      implicit none
      private
      public :: estimate

    contains

      subroutine estimate(x,y)
        ! calling arguments
        real, intent (in) :: x(:)
        real, intent (out) :: y(:)

        ! local variables
        integer :: i, jj

        jj = size(x)

        do i=1, jj
           y(i)=x(i)+zq(i)
        end do

      end subroutine estimate

    end module my_sub

    program test

      use bdat, only: &
           NT, z

      use my_sub, only: &
           estimate

      implicit none

      integer :: i
      real :: x(NT), y(NT)

      do i=1,NT
         x(i)=i+1
         z(i)=i-1
      end do

      call estimate(x,y)

      print *, y

    end program test