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