【问题标题】:Fortran runtime error: Bad integer for item 1 in list input? Not sure whyFortran 运行时错误:列表输入中第 1 项的整数错误?不知道为什么
【发布时间】:2021-09-14 21:56:08
【问题描述】:

下面是当前程序,一切都检查给我,除了当我执行程序本身时,它给了我这个错误。

Fortran runtime error: Bad integer for item 1 in list input.

第一个数字是 60000。

    implicit none
    
    !declaring the single precision for real numbers, array, and variables.
    integer :: i, firstnumber
    real*4 :: average, sum_, standarddeviation
    
    real*4, allocatable :: arrayone(:)!making sure that the array is single precision real
    
    open(unit=1,file="C:\cygwin64\data sets for labs and assignments\Numbers.txt")!opening file
    
    do 
        read(1,*)firstnumber!reading the first number
    end do

    allocate(arrayone(firstnumber))!allocating the array with the first number variable obtained from previous statement
    
    close(1)
    
    do i = 2, firstnumber
    
    open(i,file="C:\cygwin64\data sets for labs and assignments\Numbers.txt")
        read(i,*)
        
        sum_ = Sum(arrayone) !sums all of the numbers from arrayone
        
        average = Sum_/firstnumber 
        
        standarddeviation = sqrt(sum_ - average) * (sum_ - average)!calculates the standard deviation of the data set
        
        close(i)
    end do
    print*,"Average = "
    print*,"Standard Deviation = "
    
    deallocate(arrayone)!Deallocating arrayone
    
    
    print*,"Done!"
    
    end program Assignmentthree

【问题讨论】:

  • 看来您是作为 Fortran 初学者学习的。请注意,real*4 不是标准的 Fortran 语法,而是常见的非标准扩展。您还应该为调试付出一些自己的努力。尝试始终打印您刚刚阅读的内容并诊断从中发生的情况。
  • 您尝试多次阅读firstnumber,而不是一次,因为它处于无限循环中。这不可能是你的意思?之后使用read(i,*),您不会读取任何变量。最后,以不同的单位打开同一个文件,和读取后续行是不一样的。
  • 60000 不是一个坏整数,但您没有在循环中第二次读取60000:删除第一个do。你仍然不会让这个程序工作(还有很多其他问题),但第一个不必要的循环是你看到的第一个问题的(可能)原因。
  • real*4 不标准与您的问题有何关系?它没有。对于初学者来说,语法是非标准的,这是一个友好的不请自来的建议。如果你的导师需要它,你无论如何都必须使用它。
  • 您的老师没有教您如何调试?您必须自己或在我们的帮助下学习一些最基本的技术。就像我写的那样:在你的代码中插入一些print 语句,这样你就知道程序在做什么。让程序告诉你它每次读到了什么。

标签: arrays fortran integer gfortran


【解决方案1】:

扩展 francescalus 和 Vladimir F 的 cmets:

捕捉错误

调试程序的最简单方法是添加一堆print 语句。如果您将这些添加到您的代码中,例如

    implicit none
    
    !declaring the single precision for real numbers, array, and variables.
    integer :: i, firstnumber
    real*4 :: average, sum_, standarddeviation
    
    real*4, allocatable :: arrayone(:)!making sure that the array is single precision real
    
    open(unit=1,file="C:\cygwin64\data sets for labs and assignments\Numbers.txt")!opening file
    
    do 
        read(1,*)firstnumber!reading the first number
        print *, 'firstnumber = ', firstnumber
    end do

    allocate(arrayone(firstnumber))!allocating the array with the first number variable obtained from previous statement
    
    close(1)
    
    do i = 2, firstnumber
    
    open(i,file="C:\cygwin64\data sets for labs and assignments\Numbers.txt")
        read(i,*)
        
        print *, 'arrayone = ', arrayone
        
        sum_ = Sum(arrayone) !sums all of the numbers from arrayone
        
        print *, 'sum_= ', sum_
        
        average = Sum_/firstnumber 
        
        print *, 'average= ', average
        
        standarddeviation = sqrt(sum_ - average) * (sum_ - average)!calculates the standard deviation of the data set
        
        print *, 'standarddeviation= ', standarddeviation
        
        close(i)
    end do
    print*,"Average = "
    print*,"Standard Deviation = "

然后您可以查看您的程序实际在做什么,并找出问题所在。

您当前的错误

你的第一个问题是线条

do 
  read(1,*)firstnumber!reading the first number
end do

正在多次执行read 操作。它会从字面上永远尝试从文件中读取整数。显然文件是有限的,所以最终它会用完有效的东西来读取,并抛出你看到的错误。

要解决此问题,您应该通过删除行 doend do 来摆脱无限循环。

空读

你的下一个问题是语句

read(i,*)

这会从您刚刚打开的文件中读取,但不会将结果存储在任何地方。看起来您正在尝试填充您想要的 arrayone 数组

read(i,*) arrayone(j)

其中jarrayone 的索引,对应于您要填充的元素。

循环中

你遇到的另一个问题是你在一个循环内做了很多你应该在循环外做的事情。就目前而言,代码

do i = 2, firstnumber
  open(i,file="C:\cygwin64\data sets for labs and assignments\Numbers.txt")
  read(i,*)
  sum_ = Sum(arrayone)
  average = Sum_/firstnumber 
  standarddeviation = sqrt(sum_ - average) * (sum_ - average)
  close(i)
end do

将:

  • 打开文件
  • 读取文件中的第一个数字,但不要将其存储在任何地方
  • 计算整个数组arrayone 的总和、平均值和标准差,即使arrayone 的大部分元素尚未填充。
  • 关闭文件

它会一遍又一遍地做这一切,firstnumber 次。

我怀疑您要做的是从文件的2firstnumber+1 行中读取arrayonefirstnumber 元素,然后(在循环之后)计算总和、平均值和arrayone 的标准差。

为了从您的文件中读取多行,您应该只打开一次(在语句open(unit=1...),只关闭一次(使用close(1),但在程序结束时)。然后每个read 语句应该从同一个文件中读取(所以每个应该是read(1,...)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多