2014-06-16 60 views
0

我寫了這段代碼,但我不知道爲什麼它不起作用。我認爲這主要是因爲濫用子程序。我知道子程序的格式是什麼,但不知道這有什麼問題。任何人都可以爲我調試這段代碼嗎?謝謝。如何在Fortran 95中使用子程序?

PROGRAM AKI 
IMPLICIT NONE 
INTEGER:: i,j,k,l,m,n 
REAL :: R2,R1,dteta,dr 
REAL ,DIMENSION (0:100) :: teta,r 
REAL,DIMENSION(0:100,0:100) :: x,y 

CALL SETUP 
CALL GRID 
CALL SAVING 

PAUSE 
END PROGRAM 



SUBROUTINE SETUP 
REAL , DIMENSION (0:100) :: teta,r 
R2 = 10 
R1 = 5 
dr = (R2 - R1)/9 

r(1) = 5 
DO i = 1,9 
    r(i+1) = r(i) + dr 
END DO 
RETURN 
END 


SUBROUTINE GRID 

REAL , DIMENSION(0:100) :: teta,r 

REAL , DIMENSION(0:100,0:100) :: x,y 
dteta = (2 * 3.1415)/9 
teta(1) = 0 
DO j= 1 , 9 
    teta(j+1) = teta (j) + dteta 
END DO 

DO i = 1 , 10 
    DO j = 0 , 10 
     x(i,j) = r(i)*cos(teta(j)) 
     y(i,j) = r(i)*sin(teta(j)) 
    END DO 
END DO 

RETURN 
END 

SUBROUTINE SAVING 
REAL , DIMENSION(0:100,0:100) :: x,y 
OPEN(1, file= "solution.dat") 
DO i = 1,10 
    DO j = 1,10 

    WRITE(1, *) x(i,j),y(i,j) 
    END DO 
END DO 
CLOSE(1) 

RETURN 
END 
+3

歡迎來到Stack Overflow;如果你對問題更清楚,你會得到更好的答案。你期待什麼輸出,你取得了什麼?你在哪部分代碼中確定了問題所在?你能提出一個更專注於代碼部分的更具體的問題嗎?本文 - [問] - 就如何提出一個能夠獲取所需信息的問題提供了更多建議。 –

+0

@JonathanDursi謝謝。也許我需要查看一下以熟悉網站。非常感謝你。 – user3745968

回答

3

您的問題是您沒有將您的參數傳遞給子例程。您撥打SETUP,GRIDSAVING的電話都使用他們自己的本地範圍變量。這會讓你更加困惑,因爲你使用了隱式類型,它允許你使用你沒有明確聲明的變量。試試這個:

subroutine SETUP(r) 
    implicit none 
    REAL , DIMENSION (0:100), intent(out) :: r 
    real :: R2, R1, dr 

    R2 = 10 
    R1 = 5 
    dr = (R2 - R1)/9 

    r(1) = 5 
    DO i = 1,9 
     r(i+1) = r(i) + dr 
    END DO 
    RETURN 
END subroutine 

,並把它作爲

call SETUP(r) 

你需要做類似調整到其他的子程序。

如果您希望在不將這些變量傳遞給每個子例程的情況下使用這些變量,則可以使用主機範圍,並在contains語句之後和end program語句之前在主程序中包含子例程。在這種情況下,你根本不會在子例程中聲明它們,你只需要使用它們。

+0

可否請您解釋更多關於如何使用子程序而不傳遞參數給他們?我想使用全局變量。 – Rasool

+0

@Rasoolll Fortran並沒有真正的全球範圍。在F77中,通常通過在每個文件中包含一個需要訪問「全局」變量的公共塊的文件來處理「全局」變量。今天,最好使用模塊來包含想要成爲「全局」的變量,然後在需要訪問變量的每個子例程中使用該模塊。 – casey