2012-08-17 51 views
2

我想在Fortran中創建一個數組數組。Fortran中可以使用匿名數組嗎?

像下面

TYPE :: array_of_arrays 
    REAL, DIMENSION(:), POINTER :: p => NULL() 
END TYPE 

TYPE(array_of_arrays), DIMENSION(2) :: some_array 

所以,我可以做的:

REAL, DIMENSION(3), TARGET :: some_vector1 = (/1.0, 2.1, 4.3/) 
REAL, DIMENSION(3), TARGET :: some_vector2 = (/3.0, 1.2, 9.6/) 

some_array(1)%p => some_vector1 
some_array(2)%p => some_vector2 

WRITE(*,*) some_array(1)%p ! I see some_vector1 
WRITE(*,*) some_array(2)%p ! I see some_vector2 

現在對我來說,實際上宣告這些some_vector陣列是笨重對應於每個元素在我的陣列陣列。

我想要做的是在一個單獨的子例程中,臨時向量被設置爲目標,並且該子例程將我的數組數組設置爲指向該臨時向量。我可以有匿名數組。

但是,這似乎並沒有工作,我想知道如果我正在做一些Fortran不支持的東西。

因此,Fortran是否支持匿名數組,即(如果我有條件錯誤),只能通過引用訪問的數組?

+1

我不明白。瘋狂地猜測,你的單獨的子程序可能分配指針組件,使它們指向「臨時」存儲。您需要考慮臨時存儲的使用期限。也許顯示「似乎沒有工作」的代碼。 – IanH 2012-08-17 02:12:31

回答

4

當然;正如IanH所建議的那樣,你可以讓指針直接引用分配的內存,而不是引用一個變量;這是少數情況下分配的內存一旦超出範圍就不會自動取消分配的情況之一。

例如,

module arrays 


TYPE :: array_of_arrays 
    REAL, DIMENSION(:), POINTER :: p => NULL() 
END TYPE 

contains 

subroutine alloc(aa) 
    type(array_of_arrays), intent(inout) :: aa(:) 
    integer :: i 

    allocate(aa(1)%p(1)) 
    aa(1) % p = [1.] 

    allocate(aa(2)%p(5)) 
    aa(2) % p = [ (i, i=1,5) ] 

end subroutine alloc 

end module arrays 



program usearrays 
    use arrays 

    TYPE(array_of_arrays), DIMENSION(2) :: some_array 

    call alloc(some_array) 

    WRITE(*,*) some_array(1)%p ! I see some_vector1 
    WRITE(*,*) some_array(2)%p ! I see some_vector2 

    deallocate(some_array(1)) 
    deallocate(some_array(2)) 

end program usearrays 

並運行它給

$ gfortran -o arrays arrays.f90 
$ ./arrays 
    1.0000000  
    1.0000000  2.0000000  3.0000000  4.0000000  5.0000000  
+0

是的。那樣做了。我沒有意識到分配指針是我想要的。我只想到allocate子程序是用於可分配數組,但現在這是有道理的。 – EMiller 2012-08-17 19:04:35

+0

對於兩種概念上(在語言中)不同的操作,應該使用相同的語法並不明顯,但是在那裏它是...... – 2012-08-18 03:11:41

相關問題