Fortran Coder

标题: 求助end-of-file during read [打印本页]

作者: zy952616596    时间: 2015-3-2 11:01
标题: 求助end-of-file during read
各位前辈,这是小弟第一次发帖,言语措辞不当之处望海涵。
小弟编程运行时出现了这样的错误file not found,unit 5,fileE:\fortran\fem tsinghua \tsinghua fem 4 \IN.DAT。可是程序已经运用了in.dat文件的数据做了一次运算,只是后面的循环运算就不再进行了,open(5,file=‘in.dat’,status=‘old’)语句样式为此,求各位大神解惑。

作者: vvt    时间: 2015-3-2 18:04
可能性较多。
1.路径不正确。
2.第一次循环结束时,把文件删除了。

你试试把 status = 'old' 去掉试试看,会不会在其他文件夹生成 in.dat ?

如果还是找不出原因,请不全部代码给出来。
作者: zy952616596    时间: 2015-3-3 16:13
vvt 发表于 2015-3-2 18:04
可能性较多。
1.路径不正确。
2.第一次循环结束时,把文件删除了。

将status=old删掉后运行时显示end-of-file during read,unit 5,fileE.......
删除前我是将in.dat文件放在debug文件夹里的,删除后运行时在debug文件夹外生成了一个in.dat和一个out.dat,两个均为空文件。
作者: zy952616596    时间: 2015-3-3 16:18
vvt 发表于 2015-3-2 18:04
可能性较多。
1.路径不正确。
2.第一次循环结束时,把文件删除了。

[Fortran] 纯文本查看 复制代码
 PROGRAM MAIN
             DIMENSION C(5000),IA(1000),EK(36)
                  
                  OPEN(5,FILE='IN.DAT')
                  OPEN(6,FILE='OUT.DAT',STATUS='UNKNOWN')
10          READ(5,*)NG
                  IF(NG.EQ.0) STOP
                  WRITE(6,15)
15          FORMAT(//,5X
     &            '************ PLANE PROBLEM ***********',/)
                 READ(5,*)NE,MC,NX,NB,ND,EO,VO,T
                 WRITE(6,20)NG,NE,MC,NX,NB,ND,EO,VO,T
20         FORMAT(//,10X,'NG=',I4,5X,'NE=',I4,5X,'MC=',I4,5X,'NX=',I4,/,
     &        10X,'NB=',I4,5X,'ND=',I4,/,10X,'EO=',E10.4,5X,'VO=',F7.2,
     &        5X,'T=',F7.2)
                 READ(5,*)NWA,NWE,NWK,NWP,NWD
                 WRITE(6,25)NWA,NWE,NWK,NWP,NWD
25         FORMAT(/10X,'NWA=',I2,3X,'NWE=',I2,3X,'NWK=',I2,3X,
     &        'NWP=',I2,3X,'NWD=',I2)
                  NT=2*NG
                  M1=3*NE+1
                  M2=M1+2*NB
                  N1=2*NG+1
                  N2=N1+NB
                  N3=7*NE+N2
                  N4=N3+NT*ND
                  N5=N4+NT
                  NEND=N5
                  IF(NEND.LE.5000) GOTO 35
          WRITE(*,*)'***EXCEED THE  LIMIT OF ARRAY C(IN THE MIDDLE)!!***'
          WRITE(*,30) NEND
30           FORMAT(/,'*******NEND=',I6,1X,'>5000********')
                  STOP 111
35          CALL INPUT(NE,NG,NB,IA(1),C(1),IA(M1),C(N1))
                   WRITE(*,40)
40          FORMAT(/10X,'##### INPUT PASSED ######')
                   IF(MC.EQ.0)GOTO 45
                   E=EO/(1.0-VO*VO)
                   V=VO/(1.0-VO)
                   GOTO 50
45            E=EO
                    V=VO
50            NX1=NX
                    A1=E/(1.0-V*V)/4.0
                        A2=0.5*(1.0-V)
                        CALL ABC(NE,NG,NWA,IA(1),C(1),C(N2))
                        WRITE(*,55)
55            FORMAT(/10X,'###### ABC  PASSED  ######')
                 DO 60 I=N3,N4
                  C(I)=0.0
60          CONTINUE
                 DO 65 K=1,NE
                  IO=K
                  CALL KE(IO,NE,NWE,T,A1,A2,V,EK(1),C(N2))
                  CALL SUMK(IO,NE,ND,NT,IA(1),C(N3),EK(1))
65          CONTINUE
                  WRITE(*,70)
70          FORMAT(/10X,'#####  SUMK  PASSED  #####')
                  CALL CHECK(NT,ND,NWK,C(N3))
                  WRITE(*,75)
75          FORMAT(/10X,'#####  CHECK PASSED  #####')
80         READ(5,*)NF,NP
                 M3=M2+2*NF
                 N6=N5+NF
                 NEND=N6+NP-1
                 MEND=M3+2*NP-1
                 NM=0
                 IF(NEND.LE.5000)GOTO 85
                 WRITE(*,*)'***EXCEED THE LIMIT OF ARRAY C(AT THE END)!!***'
                 WRITE(*,30)NEND
                 NM=1
85         IF(MEND.LE.1000)GOTO 95
                 WRITE(*,*)'***EXCEED THE LIMIT OF ARRAY IA(AT THE END)!!***'
                 WRITE(*,90)MEND
90         FORMAT(/,'********MEND=',I6,1X,'>1000*******')
                 STOP 222
95         IF(NM.EQ.1)STOP 222
                 DO 100 I=N4,N5
                  C(I)=0.0
100        CONTINUE
                 IF(NF.GT.0)CALL PF(NF,NP,NT,NWP,C(N4),IA(M2),C(N5))
                 WRITE(*,105)
105        FORMAT(/10X,'#####  PF  PASSED  #####')
                 IF(NP.GT.0)CALL PP(NP,NT,NG,NWP,C(1),C(N4),IA(M3),C(N6))
                 WRITE(*,110)
110        FORMAT(/10X,'##### PP  PASSED #####')
                 CALL DBC(NT,ND,NB,NX,NX1,C(N3),C(N4),IA(M1),C(N1))
                 WRITE(*,115)
115        FORMAT(/10X,'##### DBC  PASSED #####')
                 CALL GAUSS(NT,ND,NWD,NX,NX1,C(N3),C(N4))
                 WRITE(*,120)
120        FORMAT(/10X,'#####  GAUSS PASSED  #####')
                 CALL STRESS(NE,NT,A1,A2,V,IA(1),C(N2),C(N4))
                 WRITE(*,125)
125        FORMAT(/10X,'#####STRESS PASSED #####')
                 NX1=NX1-1
                 IF(NX1.GT.0)GOTO 80
                 GOTO 10
                 END

作者: zy952616596    时间: 2015-3-3 16:19
vvt 发表于 2015-3-2 18:04
可能性较多。
1.路径不正确。
2.第一次循环结束时,把文件删除了。

[Fortran] 纯文本查看 复制代码
SUBROUTINE KE(IO,NE,NWE,T,A1,A2,V,EK,BCA)
         DIMENSION B(7),BCA(7,NE),EK(6,6)
         DO 10 I=1,7
          B(I)=BCA(I,IO)
10     CONTINUE
         A=A1/B(7)*T
         DO 20 I=1,3
          DO 20 J=I,3
          I1=2*I
          J1=2*J
          EK(I1-1,J1-1)=A*(B(I)*B(J)+A2*B(I+3)*B(J+3))
          EK(I1-1,J1)=A*(V*B(I)*B(J+3)+A2*B(I+3)*B(J))
          EK(I1,J1-1)=A*(V*B(I+3)*B(J)+A2*B(I)*B(J+3))
          EK(I1,J1)=A*(B(I+3)*B(J+3)+A2*B(I)*B(J))
20     CONTINUE
         DO 30 I=3,6
          DO 30 J=1,I
           EK(I,J)=EK(J,I)
30     CONTINUE
         IF(NWE.EQ.0)GOTO 60
         WRITE(6,40) IO
40     FORMAT(/1X,'EK   NE=',I5)
         WRITE(6,50)EK
50     FORMAT(1X,6E11.4)
60     RETURN
            END

作者: zy952616596    时间: 2015-3-3 16:23
vvt 发表于 2015-3-2 18:04
可能性较多。
1.路径不正确。
2.第一次循环结束时,把文件删除了。

以上两段程序分别是主程序及其中一段相关的子程序,不知道是哪里出了错误,麻烦前辈了。小弟不胜感激。。。
作者: vvt    时间: 2015-3-4 09:04
从代码片段里找出错误的难度非常大。

建议你直接上传全部源代码文件(而非复制粘贴),及输入文件 in.dat
作者: zy952616596    时间: 2015-3-4 09:32
vvt 发表于 2015-3-4 09:04
从代码片段里找出错误的难度非常大。

建议你直接上传全部源代码文件(而非复制粘贴),及输入文件 in.dat ...

前辈,附件为全部程序源代码,麻烦前辈了。

ABC.FOR

781 Bytes, 下载次数: 2

计算单元参数

CHECK.FOR

483 Bytes, 下载次数: 1

检验主元

DBC.FOR

507 Bytes, 下载次数: 1

引入给定位移

GAUSS.FOR

1.27 KB, 下载次数: 1

高斯消去

INPUT.FOR

746 Bytes, 下载次数: 3

数据输入

KE.FOR

625 Bytes, 下载次数: 1

计算单刚矩阵

MAIN PRO.FOR

2.95 KB, 下载次数: 2

主程序

PF.FOR

552 Bytes, 下载次数: 1

组装载荷

PP.FOR

714 Bytes, 下载次数: 3

计算等效节点荷载

STRESS.FOR

927 Bytes, 下载次数: 1

计算单元应力

SUMK.FOR

495 Bytes, 下载次数: 3

总刚集成


作者: vvt    时间: 2015-3-4 09:38
及输入文件 in.dat
作者: zy952616596    时间: 2015-3-4 09:55
vvt 发表于 2015-3-4 09:38
及输入文件 in.dat

附件为输入数据文件

IN.DAT

2.85 KB, 下载次数: 4

输入文件


作者: zy952616596    时间: 2015-3-4 10:27
vvt 发表于 2015-3-4 09:38
及输入文件 in.dat

前辈,附件为书上给的主程序,前几行程序没有看懂意思,所以就参考着别的程序给删掉了。给您发过去做下参考。

MAIN PRO.FOR

3.21 KB, 下载次数: 2

书中原主程序


作者: vvt    时间: 2015-3-4 10:31
与 status = 'old'  无关。

file not found 是你把 in.dat 放错了位置。
如果通过编译环境上的运行按钮运行程序,则应该放在工程文件夹。
如果通过双击debug文件夹下的exe运行,则应该放在debug文件夹。

end-of-file during read 的原因是:
in.dat 文件内容不够。
不够是相对的。

第一次循环,从第一行开始读。当最终到 GOTO 10 的时候,虽然代码里从头开始执行了,但是读取位置还是文件的末端,此时再要读,就读不了了。(因为文件里只有一次的数据)

你是否应该有一个 rewind 语句?

另外,我发现你的数据读取也有问题

主程序中,80         READ(5,*)NF,NP,此时读到的是 8,0,我假设到此为止是正确的。

那么第81行:IF(NF.GT.0)CALL PF(NF,NP,NT,NWP,C(N4),IA(M2),C(N5))

进入到 PF 函数里
SUBROUTINE PF(NF,NP,NT,NWP,F,MF,ZF)
         DIMENSION MF(2,NF),ZF(NF),F(NT)
         READ(5,*)((MF(I,L),I=1,2),L=1,NF),(ZF(L),L=1,NF)


此处又在读取in.dat,而此时文件里的数据是:
1,1,-3.750
8,1,-7.500
15,1,-7.500
22,1,-7.500
29,1,-7.500
36,1,-7.500
43,1,-7.500
50,1,-7.500
57,1,-7.500
64,1,-7.500
71,1,-7.500
78,1,-7.500
85,1,-3.750
被读入到 PF 函数里的 MF 和 ZF 数组里。看起来是错位了。因为 MF 是整型,2*8 的大小,而 ZF 是 8 的大小。
这一段数字是 13*3 的。
作者: zy952616596    时间: 2015-3-4 10:37
谢谢前辈,我自己再推算一遍看看。
作者: zy952616596    时间: 2015-3-4 22:04
vvt 发表于 2015-3-4 10:31
与 status = 'old'  无关。

file not found 是你把 in.dat 放错了位置。

前辈,我发现问题是nd的数据取错了,改完之后计算出了81个单元刚度矩阵,但是应该计算144个单元刚度矩阵,运行时显示数组超限,这会是什么情况。nd取值为16.
作者: vvt    时间: 2015-3-5 09:03
越界发生在 SUMK 函数里
SK(M,N)=SK(M,N)+EK(MO,NO)
此时的 N=2*(IJ(J)-IJ(I))+1 = 2*(57-48)+1 = 19

而 SK(182,16)

19 大于 16
作者: zy952616596    时间: 2015-3-5 14:18
vvt 发表于 2015-3-5 09:03
越界发生在 SUMK 函数里
SK(M,N)=SK(M,N)+EK(MO,NO)
此时的 N=2*(IJ(J)-IJ(I))+1 = 2*(57-48)+1 = 19

前辈一般用什么方法判断这种情况的啊,设置的断点吗?
作者: fcode    时间: 2015-3-5 15:06
是,你可以参考本文:http://fcode.cn/guide-44-1.html




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2