我正在尝试运行Fortran代码,但是在if语句中的逻辑条件下,我遇到了数组索引错误。
我正在将Intel Fortran编译器与VS2019一起使用。我试图将if条件分成单独的语句(见下文)。
给出错误的确切行是
if(i.gt.1 .and. nnext(nzcur,nbout,i,2).gt.nnext(nzcur,nbout,i-1,2))then
并位于DO
循环中,其中i
是DO
变量,在我的情况下,范围是从1
到4
。我无法提供整个项目,但是我可以重新创建一个类似的MWE:
program MWE
real array(40,40,40,2)
do i=1,4
if(i.gt.1 .and. array(1,1,i,1).gt.array(1,1,i-1,1))then
write(*,*)"foo"
endif
end do
end program
会重现错误。
如果我修改if
语句,则不会出现该错误:
program MWE
real array(40,40,40,2)
do i=1,4
write(*,*)"Stuck here", i
if(i.gt.1)then
if(array(1,1,i,1).gt.array(1,1,i-1,1))then
write(*,*)"foo"
endif
endif
end do
end program
但是,这在连续打印"Stuck here"
,i=1
时卡住了,并且没有打印"foo"
,即i
没有进行,也没有进入下一个if
块。
错误是
forrtl: severe (408): fort: (3): Subscript #3 of the array ARRAY has value 0 which is less than the lower bound of 1
我了解它正在读取条件语句,其中i-1 = 1-1 = 0
超出了数组的范围(范围从1
到40
)。
我想做的是阅读条件语句的第一部分,看到i=1<1
为假,因此忽略了if
块并继续执行代码。我试图通过将条件语句分成两个单独的if
块来执行此操作,但是正如我之前提到的DO
变量卡在1
上并且没有进展,因此从不输入第二个if
块。
为我的凌乱代码道歉,我是Fortran的新手。有没有办法让它读取if
条件的第一部分,然后继续忽略i=1
发生索引错误的后一部分?