0

我有一个简单的 Fortran 代码,但我遇到了一个我找不到解决方案的错误。有谁知道如何解决这一问题?

subroutine sort(A,A_done,N,P)
! Sort a real array by algebraically increasing value and return the permutation that 
! rearranges the array
  implicit none

  Integer N, TEMP1, K, L, P(N), TEMP2
  real(8), dimension(:) ::  A_done
  real(8), dimension(:) ::  A

  DO K=1, N-1
    DO L=K+1, N
        if A(K)>A(L)
                TEMP1=A(K)
            TEMP2=P(K)
            A(K)=A(L)
                P(K)=P(L)
        A(L)=TEMP1
            P(L)=TEMP2
    end if

    END DO
  END DO
  A_done=A
  RETURN
  END

gfortran -Wall -Werror -fbounds-check -w -L -lm -o 模拟 readinput.for nooutfile.for mean.for covariance.for correlation.for rperm.for simmain.for sort.for In file sort.for:13

     if A(K)>A(L)
    1

错误: (1) 在文件 sort.for:20 中的不可分类语句

    end if
      1

错误:在 (1) 处需要 END DO 语句 make: * [Simulation] 错误 1

谢谢您的帮助

4

1 回答 1

1

您忘记了一对括号和一个“then”:

if A(K)>A(L)您必须输入if (A(K)>A(L)) then

除此之外,您的代码还有多个问题:

  1. atTEMP1=A(K)和类似的表达式,你将一个 real(8) 值传递给一个整数变量
  2. 我不明白P变量的作用(你能描述一下吗?),但你也在那里混合了 real(8) 和 integer。
  3. 您必须在子例程中指定数组的维度。(我认为有一种方法不使用模块)
  4. 请记住,您更改了 A,然后将其复制到 A_done。为什么要这样做?您会丢失原始值并消耗更多内存。

我做了一些你可能想要保留的更正,你可以做更多。此代码编译并运行良好。

Program test

    implicit none
    integer N
    real(8), allocatable :: A(:), A_done(:), P(:)

    N=5
    Allocate (A(N), A_done(N), P(N))

    A=(/5,3,6,1,9/)
    call sort(A, A_done, N, P)

    Write (*,*) A_done

End

subroutine sort(A,A_done,N,P)
! Sort a real array by algebraically increasing value and return the permutation that 
! rearranges the array
    implicit none

    Integer N, K, L
    real(8), dimension(N) ::  A, A_done, P
    real(8) :: TEMP1, TEMP2

    DO K=1, N-1
            DO L=K+1, N
                    if (A(K)>A(L)) then
                            TEMP1=A(K)
                            TEMP2=P(K)

                            A(K)=A(L)
                            P(K)=P(L)

                            A(L)=TEMP1
                            P(L)=TEMP2
                    end if
            END DO
    END DO
    A_done=A
    RETURN
END 
于 2013-04-07T13:09:55.330 回答