我想将数组维度作为虚拟变量传递给子例程。数组本身位于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)在这种情况下必须是常数
如果有人能帮忙怎么做,我真的很感激。
答案 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