回 帖 发 新 帖 刷新版面

主题:为什么我的程序编译时总提示do循环有问题呢?

我使用两个do循环,感觉没问题的啊,为什么运行总出错。希望大家指点
ifort /nologo /Zi /Od /module:"Debug/" /object:"Debug/" /traceback /check:bounds /libs:static /threads /dbglibs /c  /Qvc8 /Qlocation,link,"C:\Program Files\Microsoft Visual Studio 8\VC\bin" "C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90"

C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(57) : Error: Syntax error, found IDENTIFIER 'EXIT' when expecting one of: <END-OF-STATEMENT> ;
      IF(P2.LE.YZ*SIGMA2) THEN EXIT
-----------------------------------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(58) : Error: An ENDDO statement occurred without a corresponding DO or DO WHILE statement.
     END DO
^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(59) : Error: An ENDDO statement occurred without a corresponding DO or DO WHILE statement.
   END DO
^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(57) : Error: An unterminated block exists.
      IF(P2.LE.YZ*SIGMA2) THEN EXIT
^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(32) : Error: An unterminated block exists.
     do J=1,KK
^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(23) : Error: An unterminated block exists.
   do I=1,NL
^
compilation aborted for C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90 (code 1)





以下是程序
      PROGRAM MAIN
    DIMENSION E(3,8),ED(1,2)
    REAL ALPHA,B,GAMA,H,P,q1,q2,B2,ZI,YZ,RI,PI,SIGMA1,SIGMA2,SIGMAT,P1,P2,PT,E1,E2,Z,S,SI,ZL
    INTEGER I,J,N,NL,K,KK,RD
      OPEN(5,FILE="IN.DAT")
    OPEN(6,FILE="OUT")
     READ(5,*) ALPHA,B,GAMA,H
      READ(5,*) NL,N,RD,ZI,YZ
    READ(5,*) ((E(I,J),j=1,n+2),i=1,NL)
      READ(5,*) (E(NL+1,I),I=1,N+2)
    WRITE(*,*) (E(NL+1,I),I=1,N+2)
      DO  I=1,RD
      READ(5,*) ED(I,1),ED(I,2)
      end do
      PI=2*ASIN(1.)
      B2=B-2*H/TAN(ALPHA)
      q1=GAMA*B*TAN(ALPHA)/2.
      q2=GAMA*(B*TAN(ALPHA)/2.-H)
      P1=2*0.5*(q1-q2)
      Z=0. 
      ZL=0
      S=0
      SIGMA1=0
      SIGMA2=0
   do  I=1,NL
       K=E(I,1)/ZI     
      if((K1*ZI-E(I,1)).eq.0.)then
      KK=K
      else
      KK=K+1      !KK为第I层土分层数
      end if
      ZL=E(I,1)/KK    !ZI为第I层土分层的厚度
      RI=I      
     do J=1,KK
       SIGMA2=SIGMA2+E(I,2)*ZL     ! 计算自重应力
       SIGMA1=SIGMA2-E(I,2)*ZL
       SIGMAT=(SIGMA1+SIGMA2)/2 
        T1=SIGMAT
        contains
       CALL INTERP (E,N,T1,EE,NL,RI)       !调用插值子程序
        E1=EE
        Z=Z+ZL
        P2=2./PI*(q2*ATAN(B/2./Z)-q1*ATAN(B2/2./Z))      !计算附加应力
        PT=(P1+P2)/2.
        T2=T1+PT
        contains
        CALL INTERP (E,N,T2,ee,NL,RI)         !调用插值子程序
        E2=EE
       WRITE(*,71) I,ZL,Z
       WRITE(*,72) SIGMA1,SIGMA2,SIGMAT
       WRITE(*,73) P1,P2,PT
       71     FORMAT(/1X,'I=', I4,3X,'HI=',F7.3,3X,'Z=',F7.3)
       72     FORMAT(10X,'SIGMA1=', F10.3,3X,'SIGMA2=',F10.3,3X,'SIGMAT=',F10.3)
       73     FORMAT(10X,'P1=', F10.3,3X,'P2=',F10.3,3X,'PT=',F10.3)      
       P1=P2    
       SI=(E1-E2)/(1+E1)*ZL*100.0
      WRITE(*,21) E1, E2, SI
      21    FORMAT(1x,"E1=",F10.3,3X,"E2=",F10.3,3X,"SI=",F10.3)
      S=S+SI
       IF(P2.LE.YZ*SIGMA2)   goto 200     
       END DO
       
200   END DO
   WRITE(*,15) S
15    FORMAT(//1X,'地基总沉降量==',F10.3,"cm")
      STOP
      END
      
    SUBROUTINE INTERP(E,N,T,Z,NL,RI) 
    DIMENSION E(3,8),X(N),Y(N)
    DO 120 I=1,N
    X(I)=E(NL+1,I+2)
    Y(I)=E(RI,I+2)
     write (*,*) X(I),Y(I)     
120   CONTINUE
    Z=0.0
    IF (N.LE.0) RETURN
    IF (N.EQ.1) THEN
      Z=Y(1)
      RETURN
    END IF
    IF (N.EQ.2) THEN
      Z=(Y(1)*(T-X(2))-Y(2)*(T-X(1)))/(X(1)-X(2))
      RETURN
    END IF
    IF (T.LE.X(2)) THEN
      K=1
      M=3
    ELSE IF (T.GE.X(N-1)) THEN
      K=N-2
      M=N
    ELSE
      K=1
      M=N
10      IF (IABS(K-M).NE.1) THEN
        L=(K+M)/2
        IF (T.LT.X(L)) THEN
          M=L
        ELSE
          K=L
        END IF
        GOTO 10
      END IF
      IF (ABS(T-X(K)).LT.ABS(T-X(M))) THEN
        K=K-1
      ELSE
        M=M+1
      END IF
    END IF
    Z=0.0
    DO 30 I=K,M
      S=1.0
      DO 20 J=K,M
        IF (J.NE.I) THEN
          S=S*(T-X(J))/(X(I)-X(J))                   
        END IF
20      CONTINUE
      Z=Z+S*Y(I)
30    CONTINUE
    RETURN
    END

回复列表 (共4个回复)

沙发

IF(P2.LE.YZ*SIGMA2) THEN EXIT
将THEN删除掉。基本的语法错误。
同时K1变量没有定义。

板凳


谢谢,可是我改了之后还是不行啊,以下是错误提示
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(40) : Error: The statement following a CONTAINS is not a function-stmt or a subroutine-stmt.
       CALL INTERP (E,N,T1,EE,NL,RI)       !调用插值子程序
----------------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(47) : Error: The statement following a CONTAINS is not a function-stmt or a subroutine-stmt.
        CALL INTERP (E,N,T2,ee,NL,RI)         !调用插值子程序
-------------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(40) : Error: This statement is incorrectly positioned.
       CALL INTERP (E,N,T1,EE,NL,RI)       !调用插值子程序
-----------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(41) : Error: This statement is incorrectly positioned.
        E1=EE
------------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(42) : Error: This statement is incorrectly positioned.
        Z=Z+ZL
--------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(43) : Error: This statement is incorrectly positioned.
        P2=2./PI*(q2*ATAN(B/2./Z)-q1*ATAN(B2/2./Z))      !计算附加应力
--------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(44) : Error: This statement is incorrectly positioned.
        PT=(P1+P2)/2.
------------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(45) : Error: This statement is incorrectly positioned.
        T2=T1+PT
------------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(47) : Error: This statement is incorrectly positioned.
        CALL INTERP (E,N,T2,ee,NL,RI)         !调用插值子程序
--------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(48) : Error: This statement is incorrectly positioned.
        E2=EE
--------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(49) : Error: This statement is incorrectly positioned.
       WRITE(*,71) I,ZL,Z
-----------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(50) : Error: This statement is incorrectly positioned.
       WRITE(*,72) SIGMA1,SIGMA2,SIGMAT
-----------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(51) : Error: This statement is incorrectly positioned.
       WRITE(*,73) P1,P2,PT
-----------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(55) : Error: This statement is incorrectly positioned.
       P1=P2    
-------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(56) : Error: This statement is incorrectly positioned.
       SI=(E1-E2)/(1+E1)*ZL*100.0
-----------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(57) : Error: This statement is incorrectly positioned.
      WRITE(*,21) E1, E2, SI
----------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(59) : Error: This statement is incorrectly positioned.
      S=S+SI
----------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(60) : Error: This statement is incorrectly positioned.
       IF(P2.LE.YZ*SIGMA2)   goto 200     
-----------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(61) : Error: This statement is incorrectly positioned.
       END DO
-------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(63) : Error: This statement is incorrectly positioned.
200        END DO
^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(64) : Error: This statement is incorrectly positioned.
   WRITE(*,15) S
---^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(66) : Error: This statement is incorrectly positioned.
      STOP
------^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(34) : Error: An unterminated block exists.
     do J=1,KK
^
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\Console5\Console5\Console5.f90(25) : Error: An unterminated block exists.
   do  I=1,NL

3 楼

你call子程序之前为啥加contains,这个是在函数体或者模块中包含子程序时候用的。

4 楼

略作修改:

      PROGRAM MAIN
    DIMENSION E(3,8),ED(1,2)
    REAL ALPHA,B,GAMA,H,P,q1,q2,B2,ZI,YZ
    real:: PI,SIGMA1,SIGMA2,SIGMAT
    integer:: RI
    real:: P1,P2,PT,E1,E2,Z,S,SI,ZL
    INTEGER I,J,N,NL,K,KK,RD
      OPEN(5,FILE="IN.DAT")
    OPEN(6,FILE="OUT")
     READ(5,*) ALPHA,B,GAMA,H
      READ(5,*) NL,N,RD,ZI,YZ
    READ(5,*) ((E(I,J),j=1,n+2),i=1,NL)
      READ(5,*) (E(NL+1,I),I=1,N+2)
    WRITE(*,*) (E(NL+1,I),I=1,N+2)
      DO  I=1,RD
      READ(5,*) ED(I,1),ED(I,2)
      end do
      PI=2*ASIN(1.)
      B2=B-2*H/TAN(ALPHA)
      q1=GAMA*B*TAN(ALPHA)/2.
      q2=GAMA*(B*TAN(ALPHA)/2.-H)
      P1=2*0.5*(q1-q2)
      Z=0. 
      ZL=0
      S=0
      SIGMA1=0
      SIGMA2=0
   do  I=1,NL
       K=E(I,1)/ZI     
      if((K1*ZI-E(I,1)).eq.0.)then
      KK=K
      else
      KK=K+1      !KK为第I层土分层数
      end if
      ZL=E(I,1)/KK    !ZI为第I层土分层的厚度
      RI=I      
     do J=1,KK
       SIGMA2=SIGMA2+E(I,2)*ZL     ! 计算自重应力
       SIGMA1=SIGMA2-E(I,2)*ZL
       SIGMAT=(SIGMA1+SIGMA2)/2 
        T1=SIGMAT
       CALL INTERP (E,N,T1,EE,NL,RI)       !调用插值子程序
        E1=EE
        Z=Z+ZL
        P2=2./PI*(q2*ATAN(B/2./Z)-q1*ATAN(B2/2./Z))      !计算附加应力
        PT=(P1+P2)/2.
        T2=T1+PT
        CALL INTERP (E,N,T2,ee,NL,RI)         !调用插值子程序
        E2=EE
       WRITE(*,71) I,ZL,Z
       WRITE(*,72) SIGMA1,SIGMA2,SIGMAT
       WRITE(*,73) P1,P2,PT
       71     FORMAT(/1X,'I=', I4,3X,'HI=',F7.3,3X,'Z=',F7.3)
       72     FORMAT(10X,'SIGMA1=', F10.3,3X,'SIGMA2=',F10.3,3X,'SIGMAT=',F10.3)
       73     FORMAT(10X,'P1=', F10.3,3X,'P2=',F10.3,3X,'PT=',F10.3)      
       P1=P2    
       SI=(E1-E2)/(1+E1)*ZL*100.0
      WRITE(*,21) E1, E2, SI
      21    FORMAT(1x,"E1=",F10.3,3X,"E2=",F10.3,3X,"SI=",F10.3)
      S=S+SI
       IF(P2.LE.YZ*SIGMA2)   goto 200     
       END DO
       
200   END DO
   WRITE(*,15) S
15    FORMAT(//1X,'地基总沉降量==',F10.3,"cm")
      STOP
      END
      
    SUBROUTINE INTERP(E,N,T,Z,NL,RI) 
    integer:: RI
    DIMENSION E(3,8),X(N),Y(N)
    DO 120 I=1,N
    X(I)=E(NL+1,I+2)
    Y(I)=E(RI,I+2)
     write (*,*) X(I),Y(I)     
120   CONTINUE
    Z=0.0
    IF (N.LE.0) RETURN
    IF (N.EQ.1) THEN
      Z=Y(1)
      RETURN
    END IF
    IF (N.EQ.2) THEN
      Z=(Y(1)*(T-X(2))-Y(2)*(T-X(1)))/(X(1)-X(2))
      RETURN
    END IF
    IF (T.LE.X(2)) THEN
      K=1
      M=3
    ELSE IF (T.GE.X(N-1)) THEN
      K=N-2
      M=N
    ELSE
      K=1
      M=N
10      IF (IABS(K-M).NE.1) THEN
        L=(K+M)/2
        IF (T.LT.X(L)) THEN
          M=L
        ELSE
          K=L
        END IF
        GOTO 10
      END IF
      IF (ABS(T-X(K)).LT.ABS(T-X(M))) THEN
        K=K-1
      ELSE
        M=M+1
      END IF
    END IF
    Z=0.0
    DO 30 I=K,M
      S=1.0
      DO 20 J=K,M
        IF (J.NE.I) THEN
          S=S*(T-X(J))/(X(I)-X(J))                   
        END IF
20      CONTINUE
      Z=Z+S*Y(I)
30    CONTINUE
    RETURN
    END

我来回复

您尚未登录,请登录后再回复。点此登录或注册