需要帮助:Fortran无限循环

问题描述

我对使用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