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(1)
而不是y(0)
,所以Fortran将y(0)
视为一个大数而不是第一个元素。如何在y
?
i=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)处的数组引用超出范围(0 <1)维度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
我刚刚使用(i)
更改了参数(i-1)
,i=0,10
更改了i=1,11
答案 0 :(得分:2)
除了implicit
之外,请不要执行任何implicit none
。当你使用隐式类型时,很容易通过简单的拼写错误来调试bug。
您可以通过直接声明数组来声明具有自定义边界的数组:
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