问题描述
我对使用Fortran还是很陌生,我似乎无法弄清楚为什么此子例程陷入无限循环。以下是上述DO循环的代码:
SUbroUTINE FILLARRAY(K,N)
REAL X,Y
INTEGER XPOS,YPOS
INTEGER K(N,N)
DO 10 I = 1,100
15 CALL RANDOM_NUMBER(X)
CALL RANDOM_NUMBER(Y)
XPOS = 20 * X + 1.0
YPOS = 20 * Y + 1.0
PRINT *,XPOS
PRINT *,YPOS
IF(K(XPOS,YPOS).NE.1) THEN
K(XPOS,YPOS) = 1
END IF
IF (K(XPOS,YPOS).EQ.1) THEN
GOTO 15
END IF
10 CONTINUE
RETURN
END
我基本上是在尝试用值1随机填充20 x 20数组。
我还想知道是否有人可以使用END IF放弃使用!谢谢!
解决方法
该数组最终将全部设置为- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args:
- '-c'
- |
TAG=${TAG_NAME}
if [ -z $${TAG} ]; then TAG=$(git describe --tags `git rev-list --tags --max-count=1`); fi
docker build -t gcr.io/$PROJECT_ID/my-project:$${TAG}
,从而导致1
的无限循环。
请尝试以下代码:
GOTO 15
,
这种方法效率极低。我会像下面这样做。请注意,我已经用i而不是1填充了,部分是为了显示填充的随机顺序,部分是作为我没有弄错的检查,因为每个数字应该恰好出现一次。
test
,
由于始终执行语句goto 15
,因此陷入无限循环。
- 如果
k(xpos,ypos)
为1
,则第一个if
语句为false,但是第二个为true,因此执行goto 15
。 - 如果相反
k(xpos,ypos)
不是1
,则第一个if
语句为true,因此k(xpos,ypos)
设置为1
。仅在此之后才对第二条if
语句进行求值,因此也是如此,因此goto 15
被执行。
正如其他答案所述,您使用的方法效率极低。但是,如果您仍要使用它,则这里是固定代码,其中包含许多现代化功能:
subroutine fillarray(k,n)
implicit none
integer,intent(in) :: n
integer,intent(inout) :: k(n,n)
real(dp) :: x,y
integer :: xpos,ypos
integer :: i
i=1
do while (i<=100)
call random_number(x)
call random_number(y)
xpos = 20*x + 1.0_dp
ypos = 20*y + 1.0_dp
if (k(xpos,ypos)/=1) then
k(xpos,ypos) = 1
i = i+1
endif
enddo
end subroutine
请注意,这假设数组k
已经初始化,否则检查数组的内容将导致未定义的行为。
关于end if
是否可选。不,这不是可选的。始终是必需的。所有语言都需要知道循环的结束位置。 C使用}
,Python使用取消缩进,Fortran使用endif
。