2013-08-02 82 views
4

我需要從Fortran程序的文件中讀取大量數據。數據的大小是可變的,所以我想動態分配數組。我的想法是創建一個讀取所有數據並分配內存的子例程。該方案的一個簡化版本是:在Fortran子程序中分配數組

program main 

    implicit none 
    real*8, dimension(:,:), allocatable :: v 
    integer*4 n 

    !This subroutine will read all the data and allocate the memory 
    call Memory(v,n) 

    !From here the program will have other subroutines to make calculations 

    end 


    subroutine Memory(v,n) 

    implicit none 
    real*8, dimension(:,:), allocatable :: v 
    integer*4 n,i 

    n=5 
    allocate(v(n,2)) 
    do i=1,n 
    v(i,1)=1.0 
    v(i,2)=2.0 
    enddo 

    return 
    end subroutine Memory 

這個節目給我下面的錯誤:

Error: Dummy argument 'v' of procedure 'memory' at (1) has an attribute that requieres an explicit interface for this procedure 

這是結構的這種程序的正確方法嗎?如果是這樣,我該如何解決這個錯誤?

謝謝。

回答

8

假設你有一個包含兩個程序和子程序的單一來源文件,爲您的文章指出,最簡單的解決方法是更換包含語句

end 

與包含語句

一行行
contains 

和寫入,在源文件的末尾包含語句

end program 
一個線

(是的,不需要關鍵字program但它是有用的。)

你的編譯器已報告的問題是,因爲你已經結構化的代碼,程序不知道該接口的子程序什麼在Fortran術語中,該接口是隱含的。當你想調用一個子程序並傳入或傳出一個可分配數組時,該子程序必須有一個明確的接口。

有幾種方法可以提供顯式接口。正如我所指出的那樣,其中一個是在程序中包含子程序。當程序變得更大時,另一種更實用的方法是將子程序寫入模塊中,並將它們用於想要使用它們的程序中。閱讀Fortran教程中涵蓋moduleuse聲明的部分。

至少有一個選擇,但它是,特別是對於初學者,沒有吸引力,我不會在這裏提到它。

而且,在我編寫時,瞭解並使用關鍵字intent指定是否讀取,寫入子程序或寫入子程序的參數。這對安全編程有很大的幫助,您最喜愛的Fortran資源將詳細解釋。

+0

謝謝!在我的真實程序中,我有多個文件,我會嘗試模塊方法。 – Msegade

+5

如果我可以提出另一個建議 - 嘗試「放棄」使用非標準實數* 8和整數* 4語法,它會限制靈活性。一種流行的方法是定義一個模塊KINDS,它使用SELECTED_INT_KIND和SELECTED_REAL_KIND爲您要使用的類型(例如SP和DP)聲明一系列PARAMETER常量,然後將REAL(DP)用於聲明。我同意Mark的觀點,模塊是你最好的選擇。 –