2012-06-09 121 views
1

問題的簡化描述的Fortran數組。他們每個人都有一個購物清單,包含物品的價格(作爲整數)。使用Fortran數組,我怎樣才能表示所有的購物清單。購物清單可能包含任何件數(1,10,1000000000)。可變大小的數組

(注:實際的問題要複雜得多它甚至不是關於購物。)

懶惰的做法是:

integer :: array(maxSize, A_REALLY_BIG_NUMBER) 

然而,這是非常浪費的,我基本上要第二維是可變的,然後分配給每個人分開。

明顯的企圖,註定要失敗的:

integer, allocatable :: array(:,:) 
allocate(array(maxSize, :)) ! Compiler error 

Fortran語言似乎要求陣列具有在每個維度一個固定的大小。

這很奇怪,因爲大多數語言將多維數組視爲「數組數組」,因此您可以分別在「數組數組」中設置每個數組的大小。

下面是一些工作:

type array1D 
    integer, allocatable :: elements(:) ! The compiler is fine with this! 
endtype array1D 

type(array1D) :: array2D(10) 
integer :: i 

do i=1, size(array2D) 
    allocate(array2D(i)%elements(sizeAt(i)) 
enddo 

如果這是唯一的解決辦法,我想我會用它。但我希望有一種方法可以使用內在函數來做到這一點。必須爲這樣一個簡單的事情定義一個自定義類型有點煩人。

在C,因爲數組基本上是花哨的語法的指針,你可以用一個指針數組做到這一點:

int sizeAt(int x); //Function that gets the size in the 2nd dimension 
int * array[maxSize]; 

for (int x = 0; x < maxSize; ++x) 
     array[x] = (int*)(calloc(sizeAt(x) , sizeof(int))); 

Fortran語言似乎有指針了。但我發現的唯一教程都說「永遠不要使用這些」或類似的東西。

+9

這是一個咆哮,而不是一個問題。 –

+3

這是Fortran的一個標準解決方案,用於執行您想要的任務。沒有什麼問題。 Fortran指針沒有錯。我將它們用於鏈接列表等數據結構。如果allocatables可以工作,我建議不要使用指針。不要指望Fortran和C是一樣的。 –

+0

我當然不是故意冒犯每個人發佈C代碼! 我只是好奇,是否有更好的方法在Fortran中實現,可能類似於C解決方案。 – cerberus586

回答

6

你似乎在抱怨Fortran不是C.的確如此。標準委員會爲什麼選擇做不同的事情可能有幾乎所有的原因,但這裏有一些想法:

fortran數組的一個強大的功能是它們可以被切片。

a(:,:,3) = b(:,:,3) 

是一個完全有效的陳述。 如果數組是「指向數組的指針」,這是不可能實現的,因爲沿着每個軸的尺寸不一定是一致的(你試圖實現的情況)。

在C中,實際上沒有多維數組這樣的東西。您可以使用指向數組的指針數組來實現類似的東西,但這並不是一個真正的多維數組,因爲它不共享公共的內存塊。這可能會影響性能。事實上,在HPC(很多Fortran用戶花費時間)中,多維C數組通常是一個包含在宏中的一維數組,用於根據維度的大小計算步幅。此外,取消引用7D陣列像這樣:

a[i][j][k][l][m][n][o] 

更是一個好一點很難輸入比:

a(i,j,k,l,m,n,o) 

最後,你已經張貼的解決方案是最接近C代碼,你試圖模仿 - 它有什麼問題?請注意,對於您的問題陳述,可能需要更復雜的數據結構(如鏈接列表)(可以用C或Fortran實現)。當然,鏈接列表在性能上是最差的,但如果這不是問題,那麼用作「購物者」的正確數據結構可能決定將更多東西添加到他們的「購物車」中,即使它不在他們到商店購物清單上。

+0

這是一個很好的答案,但我不能爲此投票。謝謝。 – cerberus586

+1

你作爲一個問題海報不應該投票,但接受或不接受一個問題。其他人會或不會爲這個答案投票(但問題已關閉)。 –