2016-09-02 45 views
0

如果我知道傳遞給函數或子例程的數組的等級和/或大小,是否有理由使用假定形狀或假定大小的數組?例如,如果我可以代替如果數組的等級/大小可用,是否有任何理由使用假定大小的數組?

function f(a,m,n) 
    real,dimension(*),intent(inout) :: a 
    ! ... 
end function 

function f(a,m,n) 
    real,dimension(m,n),intent(inout) :: a 
    ! ... 
end function 

沒有任何理由(用Fortran 90或更高版本)不這樣做呢?

+0

你的代碼示例有一個假定大小數組參數。標題和文字也提到假設形狀。就含義而言,假定的形狀和假定的尺寸是大不相同的。你真的有興趣比較顯式形狀和假設形狀嗎? – francescalus

+0

謝謝你指出。我確實有興趣比較假設大小和顯式形式(如果這就是你上面第二個例子的含義)。我會更新標題。 –

回答

5

太長了評論,而不是太多的答案...

function f(a,m,n) 
    real,dimension(m,n),intent(inout) :: a 
    ! ... 
end function 

不作a假定形狀的數組,它有明確的形狀(m,n)。這幾天我寫

function f(a) 
    real,dimension(:,:),intent(inout) :: a 
    ! ... 
end function 

在這個版本a是絕對假定形狀。在(越來越)罕見的情況下,我需要程序中的數組的大小或形狀,我通過編寫shape(a)或類似的方法來獲得它。

最後,回答OP的問題,請參見Assumed size arrays: Colon vs. asterisk - DIMENSION(:) arr vs. arr(*)

+0

當你開始製作功能f2,f3和f4時,它們只有M和N的大小不同,然後你朝着@High Performance Mark例子#2走。 Mark提到SHAPE,UBOUND和LBOUND變得有用。 – Holmz

+0

對不起,我的意思是假設尺寸,我寫了假設形狀。 –