Gfortran做循环if语句错误

时间:2013-04-03 19:37:48

标签: gfortran

我有一个简单的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 noutfile.for mean.for covariance.for correlation.for rperm.for simmain.for sort.for  在文件sort.for:13

     if A(K)>A(L)
    1

错误:(1)处的不可分类陈述  在文件sort.for:20

    end if
      1

错误:在(1)处期待END DO语句 make: * [模拟]错误1

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

你忘记了一对括号和“然后”:

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

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

  1. TEMP1=A(K)和类似的表达式中,将实数(8)值传递给整数变量
  2. 我不明白P变量的作用(你能描述一下吗?),但你也混合了真(8)和整数。
  3. 您必须在子例程中指定数组的维度。 (我认为通过使用模块有一种方法不这样做)
  4. 请记住,您更改了A,然后将其复制到A_done。为什么这样做?您将丢失原始值并消耗更多内存。
  5. 我做了一些你可能想要保留的更正,你可能会做得更多。此代码编译并运行良好。

    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