Alias not valid for module procedures

Alias not valid for module procedures

Imagen de rwg

I'm using Visual Fortran Compiler XE 12.0.4.196 [IA-32]. Following code gives me error #7836 for the last 3 calls in ARTEST which shows me that my ALIASes don't work. Is that correct?

MODULE INTARWRI_MOD

  INTERFACE INTARWRI

   MODULE PROCEDURE INTARWRI_INT

   MODULE PROCEDURE INTARWRI_REAL

   MODULE PROCEDURE INTARWRI_DBLE

   SUBROUTINE INTARWRI_INTS(IAR,IPOS,IVAL,NWORTE,ISW)

!DEC$ ATTRIBUTES DECORATE,ALIAS:"INTARWRI_INT" ::INTARWRI_INTS

    INTEGER         ,INTENT(INOUT),ALLOCATABLE:: IAR(:)

    INTEGER         ,INTENT(IN)   :: IPOS

    INTEGER         ,INTENT(IN)   :: IVAL

    INTEGER         ,INTENT(IN)   :: NWORTE

    INTEGER         ,INTENT(OUT)  :: ISW

   ENDSUBROUTINE INTARWRI_INTS

   SUBROUTINE INTARWRI_DBLES(IAR,IPOS,DVAL,NWORTE,ISW)

!DEC$ ATTRIBUTES DECORATE,ALIAS:"INTARWRI_DBLE" ::INTARWRI_DBLES

    INTEGER         ,INTENT(INOUT),ALLOCATABLE:: IAR(:)

    INTEGER         ,INTENT(IN)   :: IPOS

    DOUBLE PRECISION,INTENT(IN)   :: DVAL

    INTEGER         ,INTENT(IN)   :: NWORTE

    INTEGER         ,INTENT(OUT)  :: ISW

   ENDSUBROUTINE INTARWRI_DBLES

   SUBROUTINE INTARWRI_REALS(IAR,IPOS,RVAL,NWORTE,ISW)

!DEC$ ATTRIBUTES DECORATE,ALIAS:"INTARWRI_REAL" ::INTARWRI_REALS

    INTEGER         ,INTENT(INOUT),ALLOCATABLE:: IAR(:)

    INTEGER         ,INTENT(IN)   :: IPOS

    REAL            ,INTENT(IN)   :: RVAL

    INTEGER         ,INTENT(IN)   :: NWORTE

    INTEGER         ,INTENT(OUT)  :: ISW

   ENDSUBROUTINE INTARWRI_REALS

  ENDINTERFACE INTARWRI

CONTAINS

  SUBROUTINE INTARWRI_ANY(IAR,IPOS,IVAL,NWORTE,ISW)

  INTEGER         ,INTENT(INOUT),ALLOCATABLE:: IAR(:)

  INTEGER         ,INTENT(IN)   :: IPOS

  INTEGER         ,INTENT(IN)   :: IVAL(*)

!DEC$ ATTRIBUTES NO_ARG_CHECK::IVAL     

  INTEGER         ,INTENT(IN)   :: NWORTE

  INTEGER         ,INTENT(OUT)  :: ISW

  INTEGER,ALLOCATABLE::IHILF(:)

  INTEGER IDIMNEU

  INTEGER IEPOS

  IEPOS=IPOS+NWORTE-1

  IF(ALLOCATED(IAR)) THEN

   IF(IEPOS>=UBOUND(IAR,1)) THEN

    IDIMNEU=IEPOS*3/2

    ALLOCATE(IHILF(LBOUND(IAR,1):IDIMNEU),STAT=ISW)

    IF(ISW/=0) THEN

     CALL MSGBOX(33001,"Not enough Memory","Error",ISW)

     ISW=0

     RETURN

    ENDIF

    IHILF(LBOUND(IAR,1):UBOUND(IAR,1))=IAR

    CALL MOVE_ALLOC(IHILF,IAR)

   ENDIF

  ELSE

   IDIMNEU=5000

   IF(IEPOS>IDIMNEU) IDIMNEU=IEPOS*3/2

   ALLOCATE(IAR(IDIMNEU))

  ENDIF

  IAR(IPOS:IEPOS)=IVAL(1:NWORTE)

  ISW=1

  ENDSUBROUTINE INTARWRI_ANY

 

  SUBROUTINE INTARWRI_INT(IAR,IPOS,IVAL,NWORTE,ISW)

  INTEGER         ,INTENT(INOUT),ALLOCATABLE:: IAR(:)

  INTEGER         ,INTENT(IN)   :: IPOS

  INTEGER         ,INTENT(IN)   :: IVAL(*)

  INTEGER         ,INTENT(IN)   :: NWORTE

  INTEGER         ,INTENT(OUT)  :: ISW

  CALL INTARWRI_ANY(IAR,IPOS,IVAL,NWORTE,ISW)

  ENDSUBROUTINE INTARWRI_INT

 

  SUBROUTINE INTARWRI_REAL(IAR,IPOS,RVAL,NWORTE,ISW)

  INTEGER         ,INTENT(INOUT),ALLOCATABLE:: IAR(:)

  INTEGER         ,INTENT(IN)   :: IPOS

  REAL            ,INTENT(IN)   :: RVAL(*)

  INTEGER         ,INTENT(IN)   :: NWORTE

  INTEGER         ,INTENT(OUT)  :: ISW

  CALL INTARWRI_ANY(IAR,IPOS,RVAL,NWORTE,ISW)

  ENDSUBROUTINE INTARWRI_REAL

 

  SUBROUTINE INTARWRI_DBLE(IAR,IPOS,DVAL,NWORTE,ISW)

  INTEGER         ,INTENT(INOUT),ALLOCATABLE:: IAR(:)

  INTEGER         ,INTENT(IN)   :: IPOS

  DOUBLE PRECISION,INTENT(IN)   :: DVAL(*)

  INTEGER         ,INTENT(IN)   :: NWORTE

  INTEGER         ,INTENT(OUT)  :: ISW

  CALL INTARWRI_ANY(IAR,IPOS,DVAL,NWORTE*2,ISW)

  ENDSUBROUTINE INTARWRI_DBLE

 

  SUBROUTINE INTARWRI_CHAR(IAR,IPOS,CVAL,NCHAR,ISW)

  INTEGER         ,INTENT(INOUT),ALLOCATABLE:: IAR(:)

  INTEGER         ,INTENT(IN)   :: IPOS

  CHARACTER(*)    ,INTENT(IN)   :: CVAL

  INTEGER         ,INTENT(IN)   :: NCHAR

  INTEGER         ,INTENT(OUT)  :: ISW

  INTEGER IHILF((NCHAR+3)/4)

  CALL CARA4(CVAL,NCHAR,IHILF)

  CALL INTARWRI_ANY(IAR,IPOS,IHILF,(NCHAR+3)/4,ISW)

  ENDSUBROUTINE INTARWRI_CHAR

     

ENDMODULE INTARWRI_MOD

     

SUBROUTINE ARTEST

USE INTARWRI_MOD

INTEGER         ,ALLOCATABLE:: IAR(:)

INTEGER          IV,IA(3)

REAL             RV,RA(3)

DOUBLE PRECISION DV,DA(3)

INTEGER          ISW

EQUIVALENCE (IV,RV,DV)

CALL INTARWRI(IAR,1,IA,3,ISW)

CALL INTARWRI(IAR,1,RA,3,ISW)

CALL INTARWRI(IAR,1,DA,3,ISW)

CALL INTARWRI_INT(IAR,1,IA,3,ISW)

CALL INTARWRI_REAL(IAR,1,RA,3,ISW)

CALL INTARWRI_DBLE(IAR,1,DA,3,ISW)

CALL INTARWRI(IAR,1,IV,1,ISW)

CALL INTARWRI(IAR,1,RV,1,ISW)

CALL INTARWRI(IAR,1,DV,1,ISW)

CALL INTARWRI_INT(IAR,1,IV,1,ISW)

CALL INTARWRI_REAL(IAR,1,RV,1,ISW)

CALL INTARWRI_DBLE(IAR,1,DV,1,ISW)

ENDSUBROUTINE ARTEST

Annoying is also remark # 7712 for IV,RV and DV which only appears when error #7836 occurs and the EQUIVALENCE is present.

I also get an internal compiler error when removing the statement USE INTARWRI_MOD.

 

publicaciones de 3 / 0 nuevos
Último envío
Para obtener más información sobre las optimizaciones del compilador, consulte el aviso sobre la optimización.
Imagen de Steve Lionel (Intel)

The error messages have nothing to do with the ALIASes, which would only be used during linking. As the message says, you are not allowed by the language to pass a scalar to an array (with some exceptions.) I can't reproduce the internal compiler error using 12.0.4, but I will note that is an old version.

Steve
Imagen de rwg

Now I understand. So I will do it in a different way (see attachment).

Adjuntos: 

AdjuntoTamaño
Descargar intarwri.f5.53 KB

Inicie sesión para dejar un comentario.