配列型で宣言されたFortran関数を使用しています。問題は、コンパイラが配列の境界を保持しないこと、例えば、私は機能正規のLBOUNDを確認ここで関数配列の結果の境界を保持する
function normalize(vector)
real,dimension(0:)::vector
real,dimension(0:size(vector)-1)::normalize
real scale
integer dim
scale=norm_real(vector)
if (scale/=0) then
do dim=0,size(vector)-1
normalize(dim)=vector/scale
end do
end if
write(*,*) Lbound(normalize,1)
end function normalize
...
real, dimension(:), allocatable :: B
B = normalize(vector)
write(*,*) Lbound(B,1)
を宣言され、それが0だ、まだそれは、メインプログラムまたはでLBOUNDいもう片方は1です。 どうして私はそれをLboundにすることができますか?
問題を診断する方法を示すコードをさらに表示する必要があります。あなたはどうやって貨幣を印刷しますか? –
これはポインターがあなたの友人であるときの非常に少数の時の1つです。サブルーチンへの引数として配列を渡すとき、下限が1でない限り、実際の引数の上限と下限は呼び出しで維持されません。しかし、ポインタを渡すときは、下限と上限が維持されます。 http://stackoverflow.com/questions/38140951/fortran-subroutine-returning-wrong-values/38154225?noredirect=1#comment63750238_38154225 – jlokimlin
@jlokimlinサブルーチン引数を使用した場合、allocatableで十分です。しかし、問題は関数の結果であり、サブルーチンの引数ではありません。私はそれが非常に明確に書かれていないことに同意する。 M.S.B.の答えに対するコメントは、それを幾分説明している。 –