У меня есть несколько «Аргумент один тип в (1), но есть и другой тип при ошибках (2) в моей программе, но я не уверен, как это изменить. Есть ли другой способ написать аргументы, чем то, что я сделал?Проблема Fortran: аргумент «xx» является одним типом в (2), но является некоторым другим типом в (1)
Пс. Я компилирую в g77.Но я также пробовал . gfortran, где ошибка, которая приходит имеет вид «место несоответствие в аргументе„г“в (1) (скалярное и рангом-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)
* Я компилирую в g77 * Ну, остановитесь, начните использовать gfortran в качестве основного компилятора или компилятора Intel Fortran или Cray или IBM или Absoft или PGI. И начните использовать 'implicit none' в каждой области вашей программы. Вы становитесь постоянным здесь, что приятно для нас, но помогите нам помочь вам и начать применять современные практики программирования Fortran. Вам не нужно прилагать огромные усилия для модернизации всего вашего кода сразу, вы можете вводить новые по частям. Хорошим началом было бы написать декларации всех фиктивных аргументов для подпрограммы, с которой у вас возникают проблемы. –
@HighPerformanceMark Спасибо за ответ.Причина, по которой я использую g77, заключается в том, что это программа, написанная в 1987 году, из которой я просто хочу получить текстовый файл со значениями, которые я могу использовать в своем коде на Python. Я никогда не учил fortran, поэтому у меня с ним много проблем. Я мог бы изменить всю программу, хотя это около 5000 строк. Ради моей цели, я думаю, что проще попробовать и скомпилировать ее так, как есть. Я тоже компилировался в gfortran, хотя и возникла ошибка «несоответствие ранга», которая, похоже, связана с ошибкой g77. – JadeChee
Правильно, сообщение gfortran является более явным сообщением о той же ошибке, о которой сообщает g77. И ваша стратегия не изучать Fortran, а полагаться на незнакомцев на SO, чтобы разобраться в ваших проблемах для вас, кажется, работает хорошо :-) –