3

A実行時の入力に応じて、割り当て可能な配列をランク 1、2、または 3 にするプログラムを作成しようとしています。Aの後続の操作は似ているため、これを実行したいと思います。また、モジュール内で、モジュール プロシージャを使用したインターフェイスworkを定義しました。モジュール プロシージャを実行するとA、目的の結果が得られます。

私が現在やっていることはこれです:

program main
implicit none
integer :: rank,n=10
real*8, allocatable :: A1(:)
real*8, allocatable :: A2(:,:)
read (*,*) rank

if (rank.eq.1) then
    allocate (A1(n))
else if (rank.eq.2) then
    allocate (A2(n,n))
end if

! operate on the array
if (rank.eq.1) then
    call work(A1)
else if (rank.eq.2) then
    call work(A2)
end if

end program

何らかの方法で のランクを選択できればAifステートメントは不要になるため、物事ははるかに簡単になります。多分これは不可能ですが、すべての助けに感謝します。

4

2 に答える 2

4

配列がランク 3 であることを宣言します。より低いランクの配列が必要な場合は、関連する後続の次元をサイズ 1 に割り当てます。

real, allocatable :: array(:,:,:)
...
select case (desired_rank)
case (1) ; allocate(array(n,1,1))
case (2) ; allocate(array(n,n,1))
case (3) ; allocate(array(n,n,n))
case default ; error stop 'bad desired rank'
end select

次に、配列セクションを使用しarrayて、目的のランクと一致する連続したスライスを取得できます。あるいは、配列を操作してランク 3 の引数を取る関連プロシージャを作成し、より高い次元のサイズ 1 エクステントの意味を認識させます。

于 2016-06-27T20:09:36.700 に答える