2013-04-03 97 views
0

我有一個簡單的Fortran代碼,並且出現一個錯誤,我找不到解決方案。有誰知道如何解決這一問題?Gfortran做循環if語句錯誤

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檢查-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 

錯誤:期待END在(1)DO語句化妝:* [模擬]錯誤1

感謝您的幫助

+0

對不起,關於這一點,我想到另一種語言,那裏你知道,'如果其他'模式。 – fedvasu 2013-04-03 21:33:42

+0

那麼,我假設你看了一個語言手冊,瞭解if塊的正確語法。它告訴你什麼? – eriktous 2013-04-03 22:32:52

回答

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。爲什麼要這樣做?你失去了原有的價值並消耗更多的記憶。

我做了一些更正,你可能想保留,你可以做更多。此代碼編譯並運行良好。

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