2016-11-08 40 views
0

我想要定義一維數組phi0(ngrains)其中每個元素是一個維度(taille,taille)矩陣,所以當我尋找phi0(1)例如它應該顯示一個taille*taille元素的矩陣,並且phi0(2) .... phi0(ngrains)如何定義數組數組?

在Fortran中如何實現?

這是我迄今爲止嘗試過,但我一直得到錯誤

PROGRAM DERIVED_TYP 

    INTEGER :: i,ngrains,nmax=4 

    TYPE INITIAL   
     REAL, DIMENSION(:,:), ALLOCATABLE :: zeros(:,:) 
    END TYPE INITIAL 

    TYPE (INITIAL), dimension(:), allocatable :: phi0 


    ALLOCATE (phi0(1)%zeros(nmax,nmax)) 
    ALLOCATE (phi0(2)%zeros(nmax,nmax)) 

    print*,phi0(1)%zeros 

    !phi0(2)=INITIAL(0.) 


END PROGRAM DERIVED_TYP 
+0

你會得到什麼錯誤信息?我懷疑它們與「零」的定義有關,看起來很腥。你是否嘗試過'real,allocatable :: zeros(:,:)'而不是? – PVitt

+0

您還沒有分配'phi0'容器數組,所以當您執行'ALLOCATE(phi0(1)%zeros(nmax,nmax))'時,您正在訪問未分配數組的元素。嘗試添加'ngrains = 2;在這行之前分配(phi0(ngrains))'。 –

+0

你試過搜索嗎?這有豆處理重複前, –

回答

1

正如我在前面的評論中提到,你嘗試分配它的成員之前,你不分配phi0。這避免了這種代碼的修改版本是這樣的:

PROGRAM DERIVED_TYP 

    INTEGER :: i 
    INTEGER, parameter :: ngrains=2 ,nmax=4 

    TYPE INITIAL   
     REAL, DIMENSION(:,:), ALLOCATABLE :: zeros 
    END TYPE INITIAL 

    TYPE (INITIAL), dimension(:), allocatable :: phi0 

    !First allocate ngrains elements in our container array 
    ALLOCATE (phi0(ngrains)) 
    !Now allocate our nmax by nmax zeros array in each of our 
    !container elements. 
    do i=1,ngrains 
     ALLOCATE (phi0(i)%zeros(nmax,nmax)) 
    end do 

    print*,phi0(1)%zeros 

END PROGRAM DERIVED_TYP 

注意我已經修改了INITIAL定義,以及,沿着@PVitt註釋的線條,雖然我的編譯器並沒有抱怨原有的形成。

我也應該注意到,雖然我們分配零點陣列,但我們並沒有將它們設置爲任何東西,所以當您打印陣列時得到的內容沒有明確定義,可能無法重複,並且可能還取決於您的編譯器。

+0

看起來不錯。但只要ngrains是一個參數,你可以將'phi0'定義爲'type(initial):: phi0(ngrains)'來避免分配。 – PVitt

+1

確實可以。我沒有這樣做,以使原始問題/修復(希望)更加透明。 –

+0

當然,只是爲了記錄:) – PVitt