0

いくつかの「Argument is one type at (1) but is some other type at (2) エラーがプログラムで発生しますが、それを変更する方法がわかりません。引数を記述する他の方法はありますか?私は何をしましたか?

Ps。g77 でコンパイルします。しかし、私はgfortranでも試しました。ここで発生するエラーは、「(1)の引数 'z'でランクの不一致(スカラーとランク-1)」のようなものです。

発生するエラーは次のとおりです。

geomalb.f: In subroutine `atmsetup':
geomalb.f:1083: 
         SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
                                    1
geomalb.f:1122: (continued):
         SUMT=SUMT+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*XMU(J)
                     2
Invalid declaration of or reference to symbol `z' at (2) [initially seen at (1)]
geomalb.f:80: warning:
         COLDEN(J)=RHOP*(PRESS(J+1)-PRESS(J))/EFFG(Z(J))
                                              1
geomalb.f:1122: (continued):
         SUMT=SUMT+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*XMU(J)
                    2
Argument #1 of `effg' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS]
geomalb.f:80: warning:
         COLDEN(J)=RHOP*(PRESS(J+1)-PRESS(J))/EFFG(Z(J))
                                              1
geomalb.f:1124: (continued):
         SUMB=SUMB+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*28.01340
                    2
Argument #1 of `effg' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS]
geomalb.f:72: warning:
         CALL ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
              1
geomalb.f:1083: (continued):
         SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
                    2
Argument #2 (named `z') of `atmsetup' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS]

プログラムの一部:

      SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
     & CH4,H2,XN2,AR,IPRINT)
      PARAMETER (NMAX=201)
      DIMENSION CH4(1),H2(1),XN2(1),AR(1)
      DIMENSION TLINAL(NMAX),DLINAL(NMAX),PLINAL(NMAX)
      DIMENSION DEN(1), PRESS(1), TEMP(1), XMU(1)
      CALL LINDAL(NLEVEL,Z,TLINAL,DLINAL,PLINAL)
      DO J=1,NLEVEL
      TEMP(J)= TLINAL(J)
      DEN(J)= DLINAL(J)
      PRESS(J)=PLINAL(J)
      ENDDO
      DO 1000 ITS =1,20
      CH4(NLEVEL)=PCH4(TEMP(NLEVEL))*RHCH4/PRESS(NLEVEL)
      DO 134 J=NLEVEL-1,1,-1
      CH4SAT=PCH4(TEMP(J))/PRESS(J)
      CH4(J)=AMIN1(CH4SAT,CH4(NLEVEL),CH4(J+1))
  134  CONTINUE
      DO 20 J=1,NLEVEL
      H2(J)=FH2
      IF (FARGON .LT. 0.) THEN
      AR(J)=(-FARGON-28.0134+25.8554*H2(J)+11.9708*CH4(J))/11.9346
      ELSE
      IF (FARGON .EQ. 0.) THEN
      AR(J)=0.0
      ELSE
      AR(J)=FARGON
      ENDIF
      ENDIF
      XN2(J)=1.0 - H2(J) - CH4(J) -AR(J)
      XMU(J)=28.0134*XN2(J)+2.158*H2(J)+16.0426*CH4(J)+39.948*AR(J)
  20   CONTINUE
      SUMT=PLINAL(1)*6.02E23/10.
      SUMB=SUMT
      TLAST=TEMP(NLEVEL)
      DO J=2,NLEVEL
      DENF=294.1/(XN2(J)*294.1 + CH4(J)*410. + H2(J)*136. + AR(J)*277.8)
      DEN(J) = DLINAL(J)*DENF
      ADEN=(DEN(J)-DEN(J-1))/ALOG(DEN(J)/DEN(J-1))
      SUMT=SUMT+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*XMU(J)
      ADEN=(DLINAL(J)-DLINAL(J-1))/ALOG(DLINAL(J)/DLINAL(J-1))
      SUMB=SUMB+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*28.01340
      PRESS(J)=PLINAL(J)*SUMT/SUMB
      TEMP(J) =TLINAL(J)*(SUMT/SUMB)*(1./DENF)
      ENDDO
  30  CONTINUE
      DT= ABS(TEMP(NLEVEL)-TLAST)
      IF (DT .LT. 0.001) GO TO 1001
1000  CONTINUE
1001  IF (IPRINT .LT. 0) RETURN
      WRITE (6,139)RHCH4,FH2,FARGON,DT
      DO 135 J=1,NLEVEL-1
      WRITE(6,140)J,Z(J),PRESS(J),DEN(J),TEMP(J),
     &          CH4(J)*PRESS(J)/PCH4(TEMP(J))
     &         ,CH4(J)*100.,XN2(J)*100.,H2(J)*100.,AR(J)*100.,XMU(J)
     &         ,(TEMP(J+1)-TEMP(J))/(Z(J+1)-Z(J))
  135    CONTINUE
      J=NLEVEL
      WRITE(6,140)J,Z(J),PRESS(J),DEN(J),TEMP(J),
     &    CH4(J)*PRESS(J)/PCH4(TEMP(J))
     &    ,CH4(J)*100.,XN2(J)*100.,H2(J)*100.,AR(J)*100.,XMU(J)
  139 FORMAT(///'   BACKGROUNG ATMOSPHERE AT LEVELS'/
     & ' SURFACE HUMIDITY OF CH4:',F5.3,'  H2 MIXING RATIO:',F6.4,
     & ' ARGON SETTING:',F8.4/'  FINAL CONVERGENCE ON TEMP:',F10.5
     & , '   LINDAL ET AL SCALING'/
     &' LVL ALTITUDE  P(BARS)  DEN(CM-3) TEMP RH-CH4'
     & , ' %CH4  %N2   %H2  %AR   MU   DT/DZ'  )
  140 FORMAT(1X,I3,F8.3,1P2E10.3,0PF7.2,F5.2,2F6.2,2F5.2,4F6.2)
      RETURN
      END SUBROUTINE
      END

プログラムの前半で、サブルーチンを次のように呼び出します。

      CALL ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
     & CH4,H2,XN2,AR,IPRINT)
4

1 に答える 1

2

変数の型情報を提供せず、代わりに暗黙の型指定に依存します。デフォルトの暗黙の型付け規則では、変数Zと変数EFFGは次のように宣言されます。

real :: Z
real :: EFFG

ZとはどちらもEFFGランク 0 (スカラー) の実数変数です。これらの変数は次の方法で参照します

EFFG(Z(J))

これはランクの不一致です。Zランク 1 変数およびランク 1 変数としてアクセスしEFFGますが、それらは暗黙的にランク 0 変数として定義されています。

修正は、変数をランク 1 配列として適切に宣言することです。コメントでは、gfortran に切り替えると、エラーが一般的な「型が異なる」エラーから特定の「ランクの不一致」に変わったことに注意してください。これははるかに役立つエラー メッセージであり、(問題がすべて修正されたら) g77 がコンパイルするものを変更せずに (またはマイナーな変更を加えるだけで) gfortran を使用してコードをコンパイルできるはずであると他の人が指摘しています。最新の慣行を採用することは価値があり、簡単な出発点は変更することです

       SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
      & CH4,H2,XN2,AR,IPRINT)
       PARAMETER (NMAX=201)
       DIMENSION CH4(1),H2(1),XN2(1),AR(1)
       DIMENSION TLINAL(NMAX),DLINAL(NMAX),PLINAL(NMAX)
       DIMENSION DEN(1), PRESS(1), TEMP(1), XMU(1)

の中へ

       SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
      & CH4,H2,XN2,AR,IPRINT)
       implicit none
       integer NMAX
       real CH4, H2, XN2, AR, TLINAL, DLINAL, PLINAL, DEN, PRESS, TEMP
       real xmu, Z, EFFG, RHCH4, FH2, FARGON, ADEN, CH4SAT, DENF, DT
       real SUMB, SUMT, TLAST, PCH4
       integer NLEVEL, IPRINT, ITS, J

       PARAMETER (NMAX=201)
       DIMENSION CH4(1),H2(1),XN2(1),AR(1)
       DIMENSION TLINAL(NMAX),DLINAL(NMAX),PLINAL(NMAX)
       DIMENSION DEN(1), PRESS(1), TEMP(1), XMU(1)

Zとの寸法を決定するために水晶玉を調べていないため、この変更ではエラーが修正されないことに注意してくださいEFFG。私が行ったのは、明示的な型を追加したことだけです。これは、古代の g77 コンパイラ (および固定形式の gfortran) によって理解されるはずです。また、上記で使用されている明示的な型を決定する際にデフォルトの暗黙的な型を想定していることにも注意してください。それらが期待したものではない場合は、明示的な型付けを採用するより良い理由です。

于 2015-06-23T19:09:30.477 に答える