【发布时间】:2014-03-02 20:46:00
【问题描述】:
我想知道是否可以创建一个循环,在其中我可以调用一个子例程,其中有要定义的数组,其大小随循环变量的函数而变化。我尝试如下,但得到错误“数组绑定不是标量整数”。 如何解决这个问题?
.
.
.
iloop: do i=5,24,0.5
jloop: do j=5,20
call check(i,j,divlen,Machexit,final)
if (final.eq.1) exit iloop
enddo jloop
enddo iloop
.
.
end program
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Subroutine check(i,j,divlen,Machexit,final)
INTEGER, PARAMETER :: IVLpts=10
real :: i,divlen,Machexit
integer :: final,j
integer :: exppts,intstrtpts,contourstrtpts,totalpts,P1,P2,P3,P4,P5,P6,P7
exppts=((j*IVLpts)+((j-1)*(IVLpts-1)))
P2=(exppts-IVLpts)
P3=(IVLpts-1)
P6=(exppts-P2)
call check2(IVLpts,i,j,divlen,Machexit,final,exppts,P2,P3,P6)
End subroutine check
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Subroutine check2(IVLpts,i,j,divlen,Machexit,final,exppts,P2,P3,P6)
Real, PARAMETER :: gamma=1.4d0,Mini=1.02d0
integer,allocatable :: expcontourpts(:),M(:),x(:),y(:)
real,allocatable :: AoverAstar(:),Mvariance(:)
allocate(expcontourpts(exppts))
allocate(M(exppts))
allocate(x(exppts))
allocate(y(exppts))
allocate(AoverAstar(P6))
allocate(Mvariance(P6))
.
.
.
End subroutine check2
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
【问题讨论】:
-
这些过程是否在没有隐含的主机范围内?如果不是,则有一大堆东西将默认为 REAL,其中一些您正在用作数组索引...
-
感谢您的帮助...但是,主机范围内有一个隐含的 none 规定...在此处给出的 sn-p 中包含它...。
-
对不起,但是,像 IanH 一样,我没有看到 check2 的参数声明,特别是 exppts 和 p6 :默认情况下它们是真实值,不能用作数组维度。我还怀疑您没有将子例程放在以 IMPLICIT NONE 开头的模块中。如果它们在任何主机之外,那么它们是独立的,并且内部应该有 IMPLICIT NONE。
-
哪一行产生错误信息?
-
它基本上是数组定义......因为我错过了释放分配的数组......!!!所以在添加了“解除分配”部分和一些小改动之后,代码现在正在运行,尽管它显示了一些小故障......谢谢大家的所有讨论和帮助......
标签: arrays size fortran allocation