問題的簡化描述的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語言似乎有指針了。但我發現的唯一教程都說「永遠不要使用這些」或類似的東西。
這是一個咆哮,而不是一個問題。 –
這是Fortran的一個標準解決方案,用於執行您想要的任務。沒有什麼問題。 Fortran指針沒有錯。我將它們用於鏈接列表等數據結構。如果allocatables可以工作,我建議不要使用指針。不要指望Fortran和C是一樣的。 –
我當然不是故意冒犯每個人發佈C代碼! 我只是好奇,是否有更好的方法在Fortran中實現,可能類似於C解決方案。 – cerberus586