Fortran 读取数据文件时会给出-severe(408)下标大于上限

Fortran 读取数据文件时会给出-severe(408)下标大于上限,fortran,Fortran,我试图读取一个四列数据文件。但是,因为我遇到了很多麻烦,所以我只是尝试读取一列整数。这是我的密码: program RFF_Simple implicit none ! Variables character(len = 100):: line_in character(len = :), allocatable :: filename integer, dimension(:), allocatable :: weight,numbers

我试图读取一个四列数据文件。但是,因为我遇到了很多麻烦,所以我只是尝试读取一列整数。这是我的密码:

   program RFF_Simple
    implicit none
    ! Variables
    character(len = 100):: line_in 
    character(len = :), allocatable :: filename 
    integer, dimension(:), allocatable :: weight,numbers    
    real, dimension(:), allocatable :: fm, fc 
    integer :: iostat_1, iostat_2 
    integer :: lun, length, index    


!    Body of RFF_Simple
!    filename = 'data.txt' 
    filename = 'data_test.txt'
    iostat_1 = 0 
    iostat_2 = 0 
    length = 0          
    open(newunit = lun, file = filename, status = 'old', iostat = iostat_1) 

    !Count how many lines are in the file (length) 
    if (iostat_1 == 0) then         
        do while(iostat_2 == 0)                  
            read(lun, '(a)', iostat = iostat_2)  line_in        
            if (iostat_2 == 0) then                 
                length= length + 1                 
            endif             
        enddo
    endif            
    rewind(lun)

    allocate(numbers(length)) !Allocate arrays to have same length as number of lines 
    iostat_1 = 0 !Reset 
    iostat_2 = 0 
    index = 1 !This whole thing is confusing so I don't know whether starting from 1 or 0 is better....      
    if (iostat_1 == 0) then         
        do while(iostat_2 == 0)                                                   
            if(iostat_2 == 0) then                                                     
                read(lun,*, iostat = iostat_2) numbers(index) !This crashes the program (Severe 408)            
                index = index + 1 
            endif
        enddo
    endif

    write(*,*) 'Press Enter to Exit' 
    read(*,*) 
    end program RFF_Simple
代码编译没有问题,但运行它会产生以下结果:

是的,那是一个打印屏幕


我甚至不知道从哪里开始

这里的问题是,每次成功读取后,您都会增加
索引。上次成功读取后,我们得到了
index=length
。然后将1添加到
索引
,然后尝试读取
数字(长度+1)
,这将导致边界冲突。您可以使用常规do循环,而不是使用
do while
循环,因为我们知道要读取的行数

do index = 1, length
   read(lun,*) numbers(index)
enddo

您还可以测试
索引
是否大于
长度
,并跳出循环。

这里的问题是,每次成功读取后,您都会增加
索引
。上次成功读取后,我们得到了
index=length
。然后将1添加到
索引
,然后尝试读取
数字(长度+1)
,这将导致边界冲突。您可以使用常规do循环,而不是使用
do while
循环,因为我们知道要读取的行数

do index = 1, length
   read(lun,*) numbers(index)
enddo

您还可以测试
索引
是否大于
长度
,然后退出循环。

请始终将错误消息复制到您的问题中。这幅画不可接受。错误消息是问题中最重要的内容之一,必须可搜索。您还应该使用实际错误而不是代码更新标题<代码>严重(408)
不显示任何信息。下标比上界大得多。此外,您应该报告您正在使用的编译器,否则错误代码408是完全无用的。请阅读。如果您不知道如何从Windows控制台复制文本,请搜索internet Dude我无法复制文本cmd窗口闪烁一毫秒然后关闭。您是如何完成屏幕截图的?在互联网上搜索如何停止这种闪烁,这是一件非常基本的事情,伙计(提示-在终端插入一个读数,或者从终端开始运行)。你至少可以手工复制主要内容。我在编辑标题时可以做到这一点,你应该自己做。哈哈,协调和快速反应是我获得截图的方式。我将研究如何停止闪烁,这可能是有用的。您有链接吗?请始终将错误消息复制到您的问题中。这幅画不可接受。错误消息是问题中最重要的内容之一,必须可搜索。您还应该使用实际错误而不是代码更新标题<代码>严重(408)不显示任何信息。下标比上界大得多。此外,您应该报告您正在使用的编译器,否则错误代码408是完全无用的。请阅读。如果您不知道如何从Windows控制台复制文本,请搜索internet Dude我无法复制文本cmd窗口闪烁一毫秒然后关闭。您是如何完成屏幕截图的?在互联网上搜索如何停止这种闪烁,这是一件非常基本的事情,伙计(提示-在终端插入一个读数,或者从终端开始运行)。你至少可以手工复制主要内容。我在编辑标题时可以做到这一点,你应该自己做。哈哈,协调和快速反应是我获得截图的方式。我将研究如何停止闪烁,这可能是有用的。你有联系吗?奇怪。你一定是对的。do循环是有效的,但为了我的缘故,我将研究while循环中的索引检查。谢谢,奇怪。你一定是对的。do循环是有效的,但为了我的缘故,我将研究while循环中的索引检查。谢谢