【问题标题】:fortran dummy argument doesn't match actual argument. casting available?fortran 虚拟参数与实际参数不匹配。铸造可用吗?
【发布时间】:2014-05-24 15:51:14
【问题描述】:

我最近继承了以前使用旧版英特尔 Visual Fortran 编译器构建的 Fortran 代码。有一段代码用于编译,但现在抛出错误 #6633 'The type of the actual argument of the dummy argument.'

问题是当一个名为READ_AND_CONVERT 的函数被REAL*4 DATA_ARRAY(*) 调用时,但在READ_AND_CONVERT 中,该参数被声明为INT*2。我想它真的只是想要DATA_ARRAY的地址。

有没有办法传递DATA_ARRAY 的地址,即使它们属于不同类型?

这里是READ_AND_CONVERT

      SUBROUTINE READ_AND_CONVERT (MX, N)
C=======================================================================
C     Reads Integer*2 Data Array and Converts it to Real*4.
C
C     This is a service routine called by subroutines
C     READ_XYZ_2, READ_XYZ_4, READ_XYZ_ALL and READ_XYZ_FULL
C=======================================================================
C
      IMPLICIT  NONE
C
      INCLUDE   'XYZ.FOR'
      INCLUDE   'COMMON_XYZIO.FOR'
      INCLUDE   'COMMON_HDR.FOR'
C
C-----------------------------------------------------------------------
C     Local Parameters
C-----------------------------------------------------------------------
C
      LOGICAL    BB_FOUND
      INTEGER*2  MX, MY
      INTEGER*4  N, J
      REAL*4     YJ, BB
C
      DIMENSION MX(*), MY(2)
      EQUIVALENCE (YJ, MY(1))
C
C-----------------------------------------------------------------------
C
      CALL GET_REAL_PARAMETER ('XYZ$_OFFSET', BB, BB_FOUND)
C
      READ (LUGIN) (MX(J), J = 1,N)
C
      IF (BB_FOUND) THEN
         DO J = N, 1, -1
            YJ        = (SCALE_FACTOR * MX(J)) + BB
            MX(2*J)   = MY(2)
            MX(2*J-1) = MY(1)
         END DO
      ELSE
         DO J = N, 1, -1
            YJ        = SCALE_FACTOR * MX(J)
            MX(2*J)   = MY(2)
            MX(2*J-1) = MY(1)
         END DO
      END IF
C
      RETURN
      END

【问题讨论】:

  • 您确实需要更好地标记您的问题以获得一些关注。即使订阅了 [fortran*],我也没有听懂。 intel-fortran的粉丝只有41个,fortran的粉丝只有1500个。

标签: fortran intel-fortran


【解决方案1】:

找到解决方案here: 基本上禁用警告...通过设置属性 | Fortran |诊断 |检查例程接口 [从是更改为否]

文章还展示了如何进行强制转换,在他们的复数数组到实数数组的例子中:

use ISO_C_BINDING

complex(8), allocatable :: c(:)
real(8), pointer:: p(:)

allocate(c(N))
call C_F_POINTER(C_LOC(c), p, [2*N])
call donothing(N, p)

【讨论】:

    【解决方案2】:

    英特尔 Fortran 中有一些指令禁用给定例程和给定参数的参数类型检查。禁用对所有代码的检查是危险的!

    !DEC$ ATTRIBUTES NO_ARG_CHECK :: ARGUMENT_NAME
    

    来源:https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/288896

    【讨论】:

      猜你喜欢
      • 2014-04-26
      • 2012-12-06
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      相关资源
      最近更新 更多