2011-06-28 39 views
4

是否有必要在任何其他代碼之前聲明數組維度?例如,我已經寫了下面的簡單示例代碼:在Fortran 90中,數組維必須事先聲明嗎?

PROGRAM mytest 
    IMPLICIT NONE 
    INTEGER :: i, j, k, mysum 

    ! Let array c be a k-by-k**2 array 
    ! Determine k within the program by some means...for example, 
    mysum=0 
    DO i=1, 3 
    mysum=mysum+1 
    END DO 
    k=mysum 

    REAL, DIMENSION(k, k**2) :: c 

    WRITE(*,*) "k=", k 
    WRITE(*,*) "k**2=", k**2 
    WRITE(*,*) 
    DO i=1,size(c,1) 
    WRITE(*,"(100(3X,F3.1))") (c(i,j), j=1,size(c,2)) 
    END DO 
END PROGRAM mytest 

,我想說明的是,我想創建一個數組c大小爲k -by- k**2點,和k是僅由代碼內的其他計算確定; k在開始時並不知道。

但是,上面的代碼給了我在編譯時出現以下錯誤信息:

mytest.f90:13.31: 

    REAL, DIMENSION(k, k**2) :: c 
           1 
Error: Unexpected data declaration statement at (1) 

凡在我行代碼13是我終於宣佈c行:REAL, DIMENSION(k, k**2) :: c

在另一方面,如果我不是宣佈k並指定其尺寸前期,

PROGRAM mytest 
    IMPLICIT NONE 
    INTEGER :: i, j, k, mysum 
    REAL, DIMENSION(3,9) :: c 

    ! Let array c be a k-by-k**2 array 
    ! Determine k within the program by some means...for example, 
    mysum=0 
    DO i=1, 3 
    mysum=mysum+1 
    END DO 
    k=mysum 

    WRITE(*,*) "k=", k 
    WRITE(*,*) "k**2=", k**2 
    WRITE(*,*) 
    DO i=1,size(c,1) 
    WRITE(*,"(100(3X,F3.1))") (c(i,j), j=1,size(c,2)) 
    END DO 
END PROGRAM mytest 

我得到正確的輸出:

k=   3 
k**2=   9 

    0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
    0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
    0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 

但是,因爲我不知道k事先,我不能在我的實際代碼中完全做到這一點。是否有某種方法可以在不指定尺寸的情況下初始「聲明」數組c,然後在知道k的值時指定尺寸?

回答

10

您想使用分配數組:

PROGRAM mytest 
    IMPLICIT NONE 
    INTEGER :: i, j, k, mysum 
    REAL, DIMENSION(:,:), allocatable :: c !<- c is allocatable, rank 2 

    ! Let array c be a k-by-k**2 array 
    ! Determine k within the program by some means...for example, 
    mysum=0 
    DO i=1, 3 
    mysum=mysum+1 
    END DO 
    k=mysum 

    WRITE(*,*) "k=", k 
    WRITE(*,*) "k**2=", k**2 
    WRITE(*,*) 

    allocate(c(k,k**2))     ! <-- allocate array c with supplied shape 

    DO i=1,size(c,1) 
    WRITE(*,"(100(3X,F3.1))") (c(i,j), j=1,size(c,2)) 
    END DO 

    deallocate(c)      ! <-- deallocate when done 
END PROGRAM mytest