【问题标题】:error in fortran example - allocating memory error 1fortran 示例中的错误 - 分配内存错误 1
【发布时间】:2014-01-27 15:30:44
【问题描述】:

我是 fortran 新手,我正在尝试编写和编译我在 this address 中找到的一个简单示例,以读取一个简单的 2 列文本文件:

Date    Water-flow
717976  7.140
717977  6.570
717978  6.040
717979  5.780
717980  5.530

程序粘贴在下面,但是在尝试编译和运行时,我并不太明白由此产生的错误,请您指教我吗?

PROGRAM READHPOP
    IMPLICIT NONE
    INTEGER, PARAMETER  :: lun = 10
    INTEGER             :: res,i
    CHARACTER(len=80)   :: cbuffer
    INTEGER             :: flength
    INTEGER,ALLOCATABLE,DIMENSION(:)    :: dates
    REAL,ALLOCATABLE,DIMENSION(:)   :: water_flow
    INTEGER             :: c_position,string_length

    OPEN(UNIT=lun,FILE="st.dat",FORM="FORMATTED",IOSTAT=res)
    IF(res/=0) THEN
        PRINT*,'error in opening file, status: ',res
        STOP
    END IF
    READ(UNIT=lun,FMT='(A)',IOSTAT=res) cbuffer
    IF(res /=0) THEN
        PRINT *,'ERROR IN READING file, status: ',res
        CLOSE(UNIT=lun)
        STOP
    END IF
    string_length=LEN_TRIM(cbuffer)
    c_position=INDEX(cbuffer,':')
    READ(cbuffer(c_position+1:string_length),FMT='(A10)') flength
    ALLOCATE(dates(flength),STAT=res)
    IF (res/=0) THEN
        PRINT*,'ERROR IN ALLOCATING MEMORY, status:',res
        CLOSE(UNIT=lun)
        STOP
    END IF
    READ(UNIT=lun,FMT='(A)',IOSTAT=res) cbuffer
    DO i=1,cbuffer
        READ(UNIT=lun,FMT='(I6,1X,F6.3)') dates(i),water_flow(i)
        PRINT*,'DIAS ',dates(i)
    END DO
end PROGRAM readhpop

编辑:感谢所有输入,只是为了关闭问题,我粘贴在工作代码下方,问候!

PROGRAM READHPOP
    IMPLICIT NONE
    INTEGER, PARAMETER  :: lun = 10
    INTEGER             :: res,i
    CHARACTER(len=80)   :: cbuffer
    INTEGER             :: flength
    INTEGER,ALLOCATABLE,DIMENSION(:)    :: dates
    REAL,ALLOCATABLE,DIMENSION(:)   :: water_flow
    INTEGER             :: c_position,string_length

    OPEN(UNIT=lun,FILE="st.dat",FORM="FORMATTED",IOSTAT=res)
    IF(res/=0) THEN
        PRINT*,'error in opening file, status: ',res
        STOP
    END IF

    READ(UNIT=lun,FMT='(A)',IOSTAT=res) cbuffer

    IF(res /=0) THEN
        PRINT *,'ERROR IN READING file, status: ',res
        CLOSE(UNIT=lun)
        STOP
    END IF

    string_length=LEN_TRIM(cbuffer)
    c_position=INDEX(cbuffer,':')

    READ(cbuffer(c_position+1:string_length),FMT='(I10)') flength
    ALLOCATE(dates(flength),water_flow(flength),STAT=res)
    IF (res/=0) THEN
    PRINT*,'ERROR IN ALLOCATING MEMORY, status:',res
        CLOSE(UNIT=lun)
        STOP
    END IF
    DO i=1,flength
        READ(UNIT=lun,FMT='(I6,F6.3)') dates(i),water_flow(i)
        PRINT*,'LINE OF FILE',i,'  DAYS ',dates(i),'  WATERFLOW ',water_flow(i)
    END DO
    PAUSE
END PROGRAM READHPOP

【问题讨论】:

  • 那你写的错误在哪里?
  • 内存分配错误,状态:1
  • 那个被指定为do 循环结尾的字符cbuffer 怎么样...你的编译器没有抱怨吗?
  • 我无法解决您的错误,因为我的编译器拒绝编译它,因为@AlexanderVogt 也发现了错误。
  • 我认为 allocate 失败是因为您正在寻找冒号后的子字符串以确定元素的数量......您没有指定冒号,因此您没有得到正确的日期数。尝试在分配前打印出flength

标签: fortran


【解决方案1】:

好的,这是一个工作版本:

PROGRAM READHPOP
    IMPLICIT NONE
    INTEGER, PARAMETER  :: lun = 10
    INTEGER             :: res,i
    CHARACTER(len=80)   :: cbuffer
    INTEGER             :: flength
    INTEGER,ALLOCATABLE,DIMENSION(:)    :: dates
    REAL,ALLOCATABLE,DIMENSION(:)   :: water_flow
    INTEGER             :: c_position,string_length

    OPEN(UNIT=lun,FILE="st.dat",FORM="FORMATTED",IOSTAT=res)
    IF(res/=0) THEN
        PRINT*,'error in opening file, status: ',res
        STOP
    END IF

    READ(UNIT=lun,FMT='(A)',IOSTAT=res) cbuffer

    IF(res /=0) THEN
        PRINT *,'ERROR IN READING file, status: ',res
        CLOSE(UNIT=lun)
        STOP
    END IF

    string_length=LEN_TRIM(cbuffer)
    c_position=INDEX(cbuffer,':')

    READ(cbuffer(c_position+1:string_length),FMT='(I10)') flength
    ALLOCATE(dates(flength),water_flow(flength),STAT=res)
    IF (res/=0) THEN
    PRINT*,'ERROR IN ALLOCATING MEMORY, status:',res
        CLOSE(UNIT=lun)
        STOP
    END IF

    DO i=1,flength
        READ(UNIT=lun,FMT='(I6,F6.3)') dates(i),water_flow(i)
        PRINT*,'DIAS ',dates(i)
    END DO
end PROGRAM readhpop

问题:

  • water_flow需要分配
  • 当确定flength 时:flength 是一个整数,所以将其读取为一个整数(这里:'(I10)')。日期数应在冒号后,因此将st.dat 更改为:
Date Water-flow: 5
717976 7.140
717977 6.570
717978 6.040
717979 5.780
717980 5.530
  • 循环遍历flength 而不是cbuffer
  • 一条读取语句过多 - 您正在尝试读取超出文件末尾的内容...

【讨论】:

  • 非常感谢,这不是一个很好的学习榜样,问候
【解决方案2】:

在这一行

    READ(cbuffer(c_position+1:string_length),FMT='(A10)') flength

您在字符编辑描述符下读取了一个整数值。这很可能会在flength 中返回一个值,该值超出可分配数组的任何合理值。例如,在快速测试中,我得到了538981169 的值。将该行更改为

    READ(cbuffer(c_position+1:string_length),'(i)') flength

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多