英特尔Fortran说实际参数与伪参数不匹配?

时间:2014-03-19 21:21:21

标签: types fortran intrinsics

提前道歉,这似乎是一个非常基本的问题。遗憾的是,我不是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。

1 个答案:

答案 0 :(得分:0)

real(8)real*8不同。第一种是不可移植的,可能在不同的编译器上意味着不同的东西。第二种是非标准的,但可以依赖于8字节的实数。如果切换回real*8,是否收到错误消息?错误消息是因为调用中的变量声明与子例程中的声明不一致。您显示调用但不显示这些变量的声明。这就是需要比较的东西。

以下讨论了声明整数的方法:Fortran: integer*4 vs integer(4) vs integer(kind=4)。对于实际来说非常相似......我确信它已经在stackoveflow上了。