3

問題の簡単な説明:

店で買い物をしているのは正確に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 にもポインターがあるようです。しかし、私が見つけた唯一のチュートリアルはすべて、「決して使用しないでください」または同様のものを言っています。

4

1 に答える 1

8

Fortran は C ではないと不平を言っているようです。それは本当です。標準化委員会が異なる方法で物事を行うことを選択した理由は、ほぼ無数にあると思われますが、いくつかの考えを次に示します。

Fortran 配列の強力な点の 1 つは、それらをスライスできることです。

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

は完全に有効なステートメントです。 配列が「配列へのポインターの配列」である場合、各軸に沿った次元が必ずしも一貫しているとは限らないため、これは達成できませんでした(実装しようとしているまさにその場合)。

C には、多次元配列などというものは実際にはありません。配列へのポインターの配列を使用して似たようなものを実装できますが、メモリの共通ブロックを共有していないため、実際には多次元配列ではありません。これは、パフォーマンスに影響を与える可能性があります。実際、HPC (多くの Fortran ユーザーが時間を費やしている場所) では、多次元 C 配列は多くの場合、次元のサイズに基づいてストライドを計算するマクロでラップされた 1D 配列です。また、次のように 7D 配列を逆参照します。

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

次のものよりも入力するのが少し難しいです。

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

最後に、投稿したソリューションは、エミュレートしようとしている C コードに最も近いものです。何が問題なのですか? 問題のステートメントについては、より複雑なデータ構造 (リンクされたリストなど) が適切である可能性があることに注意してください (C または Fortran で実装できます)。もちろん、リンクされたリストはパフォーマンスに関する限り最悪ですが、それが問題にならない場合は、「買い物客」が「カート」に物を追加することを決定できるため、使用するのにおそらく正しいデータ構造です。彼らが店に持って行った買い物リストにはありませんでした。

于 2012-06-09T14:58:34.183 に答える