2016-09-03 20 views
1

配列型で宣言された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にすることができますか?

+0

問題を診断する方法を示すコードをさらに表示する必要があります。あなたはどうやって貨幣を印刷しますか? –

+1

これはポインターがあなたの友人であるときの非常に少数の時の1つです。サブルーチンへの引数として配列を渡すとき、下限が1でない限り、実際の引数の上限と下限は呼び出しで維持されません。しかし、ポインタを渡すときは、下限と上限が維持されます。 http://stackoverflow.com/questions/38140951/fortran-subroutine-returning-wrong-values/38154225?noredirect=1#comment63750238_38154225 – jlokimlin

+1

@jlokimlinサブルーチン引数を使用した場合、allocatableで十分です。しかし、問題は関数の結果であり、サブルーチンの引数ではありません。私はそれが非常に明確に書かれていないことに同意する。 M.S.B.の答えに対するコメントは、それを幾分説明している。 –

答えて

1

私はあなたができるとは思っていませんが、一方でそれは問題ではありません。 Fortranは配列の形状をより基本的なプロパティと見なします。関数の戻り値のlboundは1になりますが、lboundが0の配列、またはその他の値に割り当てることができます。それは重要なケースがありますか?

+0

はい0 Lboundの配列に関数の値を保存しても問題ありません。しかし、長いFortranコードでは、他の関数の引数として配列型の関数を渡すことが必要です(追加変数の使用を避けるため)、またはfortran 2003で許可されているので割り付け可能な値を自動的に割り当てる必要があります。例B =正規化(ベクトル))。 Bはこの場合動的配列です。 –

+0

この回答は正しいですが、できません。特定の下限に割り当てる場合は、サブルーチンを使用できます。関数を使用することはできません。あなたが最終的に達成したいことは、私にはまだ完全には分かりません。 –

+0

@VladimirF質問は、配列型を返す関数の形状を保持する方法です。なぜなら、メインプログラムで呼び出すときにはそれが変化するからです。 –

関連する問題