Loops 如何将数组的默认界限从1降低到0?

Loops 如何将数组的默认界限从1降低到0?,loops,fortran,Loops,Fortran,您好,我正在打印函数的值,y, 所以我的程序应该打印y(0),y(1),y(2)…y(10)。但由于在Fortran中,第一个元素是y(1)而不是y(0),因此Fortran将y(0)视为一个大数字,而不是第一个元素。当I=0时,如何获得y的结果 我的第一次尝试是: implicit real*8 (a-h,o-z) real*8 x,y(11) do i=0,10 x=0.35139534352933061.D0 y=1.D0/x*(

您好,我正在打印函数的值,
y
, 所以我的程序应该打印
y(0),y(1),y(2)…y(10)
。但由于在Fortran中,第一个元素是
y(1)
而不是
y(0)
,因此Fortran将
y(0)
视为一个大数字,而不是第一个元素。当
I=0
时,如何获得
y
的结果

我的第一次尝试是:

     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
但我得到以下警告:

警告:(1)处的数组引用超出维度1中的范围(0<1)

我的解决方法是:

     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

我刚刚用
(I-1)
更改了参数
(I)
,用
I=1,11
更改了
I=0,10
请不要做任何
隐式
以外的
隐式
。当您使用隐式类型时,通过简单的输入错误创建难以调试的bug太容易了

通过直接声明数组,可以使用自定义边界声明数组:

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
但请注意,数组边界不会通过过程调用保持不变:

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

声明为实y(0:10)
。顺便说一句,您的
y=
分配是分配给整个数组的。谢谢,这就是解决方案。有一件事经常让我感到烦恼,那就是数组是否有边界,何时传递,何时不传递。当我有真实的,维度(:),意图::A时,它似乎起作用了。这是密切相关的,因为我有一个插值和分配数组(0:(n+1))。。。或者是可分配的细微差别?我不知道这是否有效。我相当肯定,如果每个新范围的边界不是从
1
开始的,那么您需要显式地声明它们的边界。也许这就是为什么它“总是令人烦恼”的原因吧?我正在使用ifort 2013,所以我会检查它,但我使用的是LBOUND和UBOUND,它是正确的。
 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