Fortran 程序报告的错误显然不符合';不存在
使用命令编译程序后运行程序时,出现以下错误Fortran 程序报告的错误显然不符合';不存在,fortran,gfortran,fortran95,Fortran,Gfortran,Fortran95,使用命令编译程序后运行程序时,出现以下错误 Fortran runtime error: Substring out of bounds: lower bound (0) of 'x' is less than one 另据报道,错误位于以下子程序的第10行 01 subroutine create_table_MP (x, m, t) 02 implicit none 03 character(len=*), intent(in) :: x 04 integer, dim
Fortran runtime error: Substring out of bounds: lower bound (0) of 'x' is less than one
另据报道,错误位于以下子程序的第10行
01 subroutine create_table_MP (x, m, t)
02 implicit none
03 character(len=*), intent(in) :: x
04 integer, dimension(0:), intent(inout) :: t
05 integer, intent(in) :: m
06 integer :: i, j
07 i=0; t(0)=-1; j=-1
08 do while (i < m)
09 if (j > -1) then
10 do while ((j>-1).and.(ichar(x((i+1):(i+1)))/=ichar(x((j+1):(j+1)))))
11 j = t(j)
12 end do
13 end if
14 i=i+1; j=j+1; t(i)=j
15 end do
16 end subroutine create_table_MP
添加一些print语句,当您处于内部循环时,您将看到它与
t(0)=-1的关系。下一件事是用j=0
测试((j>-1)和(ichar(x((i+1):(i+1))/=ichar(x((j+1):(j+1‘))
,这会生成您现在不理解的内容
program myprogram
integer, parameter :: M = 11
character(M-1) :: x = "0123456789"
integer, dimension(M) :: t
call create_table_MP (x, m, t)
contains
subroutine create_table_MP (x, m, t)
implicit none
character(len=*), intent(in) :: x
integer, dimension(0:), intent(inout) :: t
integer, intent(in) :: m
integer :: i, j
i=0; t(0)=-1; j=-1
do while (i < m)
if (j > -1) then
write(*,*), "outer j = ", j
do while ((j>-1).and.(ichar(x((i+1):(i+1)))/=ichar(x((j+1):(j+1)))))
j = t(j)
write(*,*), " innerj = ", j
end do
end if
i=i+1; j=j+1; t(i)=j
end do
end subroutine create_table_MP
end program myprogram
程序我的程序
整数,参数::M=11
字符(M-1)::x=“0123456789”
整数,维数(M)::t
调用create_table_MP(x,m,t)
包含
子例程create_table_MP(x,m,t)
隐式无
字符(len=*),意图(in)::x
整数,维度(0:),意图(inout)::t
整数,意图(in)::m
整数::i,j
i=0;t(0)=-1;j=-1
做一会儿(我-1),则
写入(*,*),“外部j=”,j
做while((j>-1)和(ichar(x((i+1):(i+1))/=ichar(x((j+1):(j+1щ))
j=t(j)
写入(*,*),“innerj=”,j
结束
如果结束
i=i+1;j=j+1;t(i)=j
结束
结束子例程创建表
结束程序myprogram
添加一些打印语句,当您处于内部循环时,您将看到它与t(0)=-1的关系。下一件事是用j=0
测试((j>-1)和(ichar(x((i+1):(i+1))/=ichar(x((j+1):(j+1‘))
,这会生成您现在不理解的内容
program myprogram
integer, parameter :: M = 11
character(M-1) :: x = "0123456789"
integer, dimension(M) :: t
call create_table_MP (x, m, t)
contains
subroutine create_table_MP (x, m, t)
implicit none
character(len=*), intent(in) :: x
integer, dimension(0:), intent(inout) :: t
integer, intent(in) :: m
integer :: i, j
i=0; t(0)=-1; j=-1
do while (i < m)
if (j > -1) then
write(*,*), "outer j = ", j
do while ((j>-1).and.(ichar(x((i+1):(i+1)))/=ichar(x((j+1):(j+1)))))
j = t(j)
write(*,*), " innerj = ", j
end do
end if
i=i+1; j=j+1; t(i)=j
end do
end subroutine create_table_MP
end program myprogram
程序我的程序
整数,参数::M=11
字符(M-1)::x=“0123456789”
整数,维数(M)::t
调用create_table_MP(x,m,t)
包含
子例程create_table_MP(x,m,t)
隐式无
字符(len=*),意图(in)::x
整数,维度(0:),意图(inout)::t
整数,意图(in)::m
整数::i,j
i=0;t(0)=-1;j=-1
做一会儿(我-1),则
写入(*,*),“外部j=”,j
做while((j>-1)和(ichar(x((i+1):(i+1))/=ichar(x((j+1):(j+1щ))
j=t(j)
写入(*,*),“innerj=”,j
结束
如果结束
i=i+1;j=j+1;t(i)=j
结束
结束子例程创建表
结束程序myprogram
第9行if语句中的条件仅保证j
仅在从第10行开始的循环的第一次迭代中不为负。在该循环的第11行,我们可以看到j
采用t(j)
给出的值。if语句不检查该值是否为负值
也就是说,假设j
为正。然后第9行通过一个.TRUE.
,并检查从第10行开始的循环的条件。while条件表达式的左侧为.TRUE.
,假设右侧也是。这样循环就会迭代
在某一点上,也许j(t)
变为负值。然后我们回到第10行,检查while条件。在这一点上,我们看到了x的越界错误:回想一下,if语句没有被命中,并且带有和。
的表达式没有短路。[也就是说,左侧的j>-1
不能确保右侧的j
值为非负。第9行的if语句中的条件仅保证j
仅在从第10行开始的循环的第一次迭代中不是负的。在该循环的第11行,我们可以看到j
采用t(j)
给出的值。if语句不检查该值是否为负值
也就是说,假设j
为正。然后第9行通过一个.TRUE.
,并检查从第10行开始的循环的条件。while条件表达式的左侧为.TRUE.
,假设右侧也是。这样循环就会迭代
在某一点上,也许j(t)
变为负值。然后我们回到第10行,检查while条件。在这一点上,我们看到了x的越界错误:回想一下,if语句没有被命中,并且带有和。
的表达式没有短路。[也就是说,左边的j>-1
不能确保右边的j
值为非负。第11行的t(j)
值是否小于零?请不要将外部主机用于代码等重要信息。链接会随着时间而腐烂。第11行的t(j)
是否曾经小于零?请不要将外部主机用于代码等重要信息。链接随着时间而腐烂。