問題の簡単な説明:
店で買い物をしているのは正確にmaxSizeの人です。それらのそれぞれには、アイテムの価格 (整数として) を含む買い物リストがあります。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 にもポインターがあるようです。しかし、私が見つけた唯一のチュートリアルはすべて、「決して使用しないでください」または同様のものを言っています。