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)
是否曾经小于零?请不要将外部主机用于代码等重要信息。链接随着时间而腐烂。