2017-02-26 6 views
2
 implicit real*8 (a-h,o-z) 
    real*8 x,y(11) 

    do i=0,10 
     x=0.35139534352933061.D0 
     y=1.D0/x*(cosh(x/2.D0*(2.D0*i-a))-cosh(x*a/2.D0)) 
     write(*,*) i,y(i) 
    end do 

こんにちは、y、 の値を印刷しようとしていますので、私のプログラムはy(0),y(1),y(2)...y(10)を印刷する必要があります。しかし、Fortranでは、最初の要素がy(0)ではなくy(1)であるため、Fortranは最初の要素の代わりにy(0)を大きな数値として扱います。 i=0の場合、どうすればyの結果を得ることができますか?配列のデフォルト境界を1から0に下げるにはどうすればよいですか?

私の最初の試みは、次のとおりです。

 implicit real*8 (a-h,o-z) 
    real*8 x,y(11) 

    do i=0,10 
     x=0.35139534352933061.D0 
     y=1.D0/x*(cosh(x/2.D0*(2.D0*i-a))-cosh(x*a/2.D0)) 
     y0=1.D0/x*(cosh(x/2.D0*(-a))-cosh(x*a/2.D0)) 
     y(0)=y0 
     write(*,*) i,y(i) 
    end do 

しかし、私は次の警告を得る:

警告:(1)の配列の参照は、次元1

における境界(0 < 1)の外にあります

問題のための私の回避策:

do i=1,11 
    y=1.D0/x*(cosh(x/2.D0*(2.D0*(i-1)-a))-cosh(x*a/2.D0)) 
    write(10,*) i,y(i) 
    end do 

私はちょうどimplicit none以外のimplicitをしないでくださいi=1,11

+2

は 'real y(0:10)'として宣言します。ところで、あなたの 'y = '代入は配列全体に代入されています。 – agentp

+0

ありがとう、それは解決策でした。 –

答えて

2

(i-1)i=0,10で引数(i)を変更しました。暗黙の型を使用すると単純なタイプミスでバグをデバッグするのは難しいです。

あなたがそれらを直接宣言することによって、カスタムの境界を持つ配列を宣言することができます

real :: x(0:10) 
real, dimension(-5:5, 2:17) :: y 

注意配列の境界は、手続きを通じて持続しないというけれどもコール:

module test_bounds 

    implicit none 

contains 
    subroutine print_a(a) 
     integer, intent(in) :: a(:) 
     print*, 'w/o passed bounds:' 
     print*, 'lbound(a) : ', lbound(a, 1) 
     print*, 'ubound(a) : ', ubound(a, 1) 
    end subroutine print_a 

    subroutine print_a_bounds(a, start) 
     integer, intent(in) :: start 
     integer, intent(in) :: a(start:) 
     print*, 'w passed bounds:' 
     print*, 'lbound(a) : ', lbound(a, 1) 
     print*, 'ubound(a) : ', ubound(a, 1) 
    end subroutine print_a_bounds 
end module test_bounds 


program bounds 
    use test_bounds 
    implicit none 
    integer :: a(0:10) 
    integer :: i 

    a = (/ (i, i=0, 10) /) 

    print*, 'in main:' 
    print*, 'lbound(a) : ', lbound(a, 1) 
    print*, 'ubound(a) : ', ubound(a, 1) 


    call print_a(a) 
    call print_a_bounds(a, start=lbound(a, 1)) 

end program bounds 

は出力:

in main: 
lbound(a) :   0 
ubound(a) :   10 
w/o passed bounds: 
lbound(a) :   1 
ubound(a) :   11 
w passed bounds: 
lbound(a) :   0 
ubound(a) :   10 
+0

配列の範囲と渡されたときとそうでないとき、私は定期的に私を悩ます事があります。私がREAL、DIMENSION(:)、intent :: Aを持っているとき、それはうまくいくようです。補間があり、配列(0:(n + 1))を割り当てているので、それは密接に関係しています...または割り当て可能なニュアンスですか? – Holmz

+0

私はこれまでこれを認識していないよ。私は、あなたが明示的に新しいスコープの境界を '1'以外のどこかで宣言する必要があると確信しています。 – chw21

+0

おそらくそれが「今までに困っている」のはなぜですか?私はifort 2013を使用していますので、私はそれをチェックしますが、私はLBOUNDとUBOUNDを使用していました。 – Holmz

関連する問題