Text 使用Fortran读取未格式化的文本数据(与gfortran和intel Fortran的区别)

Text 使用Fortran读取未格式化的文本数据(与gfortran和intel Fortran的区别),text,io,segmentation-fault,fortran,Text,Io,Segmentation Fault,Fortran,我试图在FORTRAN程序中从一个非常大的文本文件中读取数据。使用“英特尔Fortran编译器”编译时,该程序运行良好,但使用gfortran编译时会出现错误 数据文件的格式设置为每行通常有六个单条。但每10k线有一条小于6个值的线。例如: 0.1466E+01 0.1459E+01 0.1203E+01 0.1362E+01 0.1281E+01 0.1544E+01 0.1480E+01 0.1517E+01 0.1238E+01 0.1056E+01 0.1204E+01

我试图在FORTRAN程序中从一个非常大的文本文件中读取数据。使用“英特尔Fortran编译器”编译时,该程序运行良好,但使用gfortran编译时会出现错误

数据文件的格式设置为每行通常有六个单条。但每10k线有一条小于6个值的线。例如:

0.1466E+01  0.1459E+01  0.1203E+01  0.1362E+01  0.1281E+01  0.1544E+01
0.1480E+01  0.1517E+01  0.1238E+01  0.1056E+01  0.1204E+01  0.1269E+01
                                 :
0.3555E+00  0.3253E+00  0.6127E+00  0.6702E+00  0.1848E+01  0.2122E+01
0.2039E+01  0.6350E+00  0.6725E+00
我用FORTRAN编写了一个程序来读取这个文件。最低版本如下所示:

PROGRAM bigdataread

REAL,ALLOCATABLE :: VAR(:)
INTEGER :: NP, NVAR, NPER
CHARACTER(len=80) :: MOPFILE

       MOPFILE = 'bigdata.OUT'
       NP = 9945            ! Number of grid points
       NVAR = 7             ! Number of Variables
       NPER = 2920      ! Number of times-steps

    ALLOCATE(VAR(NP*NVAR*NPER))
    WRITE(LUNCO,*)'Alocated size ',SIZE(VAR)
    OPEN(UNIT=8,FILE=MOPFILE)    
    READ(8,*,END=104,ERR=101)VAR
    WRITE(*,*)'Bigdata sucsessfully read'

    STOP

104    WRITE(*,*)'Reached end of file'
101    WRITE(*,*)'Problem reading in the .OUT file'

STOP
END
如果“NPER”大于1300,则使用gfortran编译的程序将出错。我已使用“$wc bigdata.OUT”确认数据文件具有正确数量的值。考虑到对可变大小的依赖,这似乎是一个内存问题,但我不知道如何解决。我的理解是,默认情况下,gfortan将数组放在堆上而不是堆栈上。有人知道这是怎么回事吗?也许您对进一步调试此问题有一些有用的建议

以下是我的平台的细节:

gcc版本4.6.3 Ubuntu/Linaro 4.6.3-1ubuntu5

ifort版本12.1.3

处理器:3.20GHz的12x IntelR CoreTM i7-3930K CPU

内存:已使用16412MB 8865MB


操作系统:Linux Mint 13 Maya

列出了各种最新的gfortran分段错误。这些是你的吗?谢谢你的建议。据我所知,我遇到的问题不在bug列表中。首先,检查allocate语句的返回状态。第二,控制读取数据,不要使用列表定向输入一次性吞掉var。这两个步骤都不一定能解决问题,但其中一个或两个步骤应该能帮助您更准确地诊断问题。对于Fortran来说,无格式文本不是一个非常幸运的术语。尝试使用编译器的调试选项-g-fbacktrace-fcheck=all,可能还有valgrind来确定问题发生的位置。因此,我会使用编辑器从包含第33869081行的输入文件中剪切一个片段,看看问题是否是gfortran不喜欢的那一行末尾的奇怪字符。