提前道歉,这似乎是一个非常基本的问题。遗憾的是,我不是Fortran程序员,但是我不得不维护一些遗留的FORTRAN77代码,并且它没有在英特尔Visual Fortran Parallel XE 2013(使用VS2010)中进行编译。
我得到的错误是
错误#6633:实际参数的类型与伪参数的类型不同。
它发生在对项目中定义的子例程的多次调用中。此代码具有语句
IMPLICIT REAL(8) (A-H,O-Z)
始终在调用函数和被调用子例程中。 (它曾是REAL*8
,但我改变了它。)
这是不是意味着所有名称都属于范围(A-H,O-Z)的参数将是双字节的实数?我不知道他们在哪里宣布或以其他方式转换为任何其他类型。子程序中调用的唯一函数是内部数学函数,例如cos,sin,atan2。
以下是一个例子:
INCLUDE 'common.f'
... ! (many lines of code)
C Transform from RS to RL
call RS$RL(0,iobl,1,vrel,xlatgc,gam,az,vph,vth,vr,
* xlatgd,gaml,azl,vphl,vthl,vrl)
调用
SUBROUTINE RS$RL(ID,IOBL,IV,VREL,TH,GAM,AZ,VPH,VTH,VR,
* THL,GAML,AZL,VPHL,VTHL,VRL)
C* DECLARATIONS
IMPLICIT REAL(8) (A-H,O-Z)
C IMPLICIT REAL*8(A-H,O-Z)
DEL = THL-TH
IF(ID.EQ.0) THEN
C* TRANSFORM FROM RS TO RL FRAME
IF(IV.EQ.0) THEN
VPH = VREL*COS(GAM)*SIN(AZ)
VTH = VREL*COS(GAM)*COS(AZ)
VR = VREL*SIN(GAM)
ENDIF
IF(IOBL.EQ.0) THEN
VPHL = VPH
VTHL = VTH
VRL = VR
ELSE
VPHL = VPH
VTHL = VTH*COS(DEL)-VR*SIN(DEL)
VRL = VTH*SIN(DEL)+VR*COS(DEL)
ENDIF
GAML = ATAN2(VRL,SQRT(VPHL**2+VTHL**2))
AZL = ATAN2(VPHL,VTHL)
ELSE
C* TRANSFORM FROM RL FRAME TO RS FRAME
IF(IV.EQ.0) THEN
VPHL = VREL*COS(GAML)*SIN(AZL)
VTHL = VREL*COS(GAML)*COS(AZL)
VRL = VREL*SIN(GAML)
ENDIF
IF(IOBL.EQ.0) THEN
VPH = VPHL
VTH = VTHL
VR = VRL
ELSE
VPH = VPHL
VTH = VTHL*COS(DEL)+VRL*SIN(DEL)
VR =-VTHL*SIN(DEL)+VRL*COS(DEL)
ENDIF
GAM = ATAN2(VR,SQRT(VPH**2+VTH**2))
AZ = ATAN2(VPH,VTH)
ENDIF
RETURN
END
文件 common.f 在文件的最顶部包含行IMPLICIT REAL(8) (A-H,O-Z)
,后面是许多显式声明,其中没有一个包含产生编译的违规参数错误。
错误消息抱怨参数,vrel,xlatgc,gam,az。
答案 0 :(得分:0)
real(8)
与real*8
不同。第一种是不可移植的,可能在不同的编译器上意味着不同的东西。第二种是非标准的,但可以依赖于8字节的实数。如果切换回real*8
,是否收到错误消息?错误消息是因为调用中的变量声明与子例程中的声明不一致。您显示调用但不显示这些变量的声明。这就是需要比较的东西。
以下讨论了声明整数的方法:Fortran: integer*4 vs integer(4) vs integer(kind=4)。对于实际来说非常相似......我确信它已经在stackoveflow上了。