[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference turris::fortran

Title:Digital Fortran
Notice:Read notes 1.* for important information
Moderator:QUARK::LIONEL
Created:Thu Jun 01 1995
Last Modified:Fri Jun 06 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:1333
Total number of notes:6734

1210.0. "Problem with adjustable arrays on Alpha." by PRSSOS::MAILLARD (Denis MAILLARD) Wed Mar 05 1997 07:45

	One of my customers just reported me a problem he encountered in porting
an application from DEC Fortran VAX to Digital Fortran Alpha.

	On VAX the code compiles smoothly, links without problem with the
appropriate other objects and has been running for years.

	The compilation of the offending module with DEC Fortran V6.3-160 on VAX
(VMS V6.2) just gives the following informative diagnostics, coming from
variables that are used by other modules:

%FORT-I-VARUNUSED, Variable was declared but not used
        [HLP_WORKSPACE] in module ECRSTD
%FORT-I-VARUNUSED, Variable was declared but not used
        [TROUVE] in module ECRSTD
%FORT-I-VARUNUSED, Variable was declared but not used
        [RELCUR] in module ECRSTD
%FORT-I-VARUNUSED, Variable was declared but not used
        [TYPCUR] in module ECRSTD
%FORT-I-VARUNUSED, Variable was declared but not used
        [CODVID] in module ECRSTD
%FORT-I-VARUNUSED, Variable was declared but not used
        [NOMCUR] in module ECRSTD
%FORT-I-VARUNUSED, Variable was declared but not used
        [NTAB] in module NGETTAB
%FORT-I-VARUNUSED, Variable was declared but not used
        [SNTAB] in module NGETTAB
%FORT-I-ENDDIAGS, USERS3:[MAILLARD.GEC]PB.FOR;1 completed with 8 diagnostics

	On Alpha (VMS V7.1), with Digital Fortran 77 V7.1-107, the compilation
gives 12 warnings (4 %FORT-W-NOVALUE, 4 %FORT-W-NOEPDEFDA and 4
%FORT-W-DAUNDEFEP).

	The module merely defines subroutines, using the ENTRY statement. At
execution on Alpha, the adjustable arrays passed as arguments are seen with
dimension 0, leading to application failures.

	I don't understand what's wrong in the program. Could someone more
learned in Fortran than I am tell me whether this comes from a programming error
or if I should report a compiler problem, please?

	Following come first the output of the Alpha compilation, then four
small include files referenced by the module, then the Fortran module (PB.FOR).
		Thanks for any input,
			Denis.

========================================================================
		Alpha Compilation output
========================================================================
$ fort pb

           VALS( POSCUR)( IND_DEB:IND_FIN) = ' '
...........^
%FORT-W-NOVALUE, No value
at line number 646 in file USERS3:[MAILLARD.GEC]PB.FOR;1

           VALS( POSCUR)( IND_DEB:IND_FIN) = ' '
...........^
%FORT-W-NOEPDEFDA, No entry point leading to this statement defines dummy argument VALS
at line number 646 in file USERS3:[MAILLARD.GEC]PB.FOR;1

           SAVS( POSCUR)( IND_DEB:IND_FIN) = ' '
...........^
%FORT-W-NOVALUE, No value
at line number 647 in file USERS3:[MAILLARD.GEC]PB.FOR;1

           SAVS( POSCUR)( IND_DEB:IND_FIN) = ' '
...........^
%FORT-W-NOEPDEFDA, No entry point leading to this statement defines dummy argument SAVS
at line number 647 in file USERS3:[MAILLARD.GEC]PB.FOR;1

       CALL TGETTAB( VALS, SVALS)
.....................^
%FORT-W-DAUNDEFEP, Dummy argument VALS is undefined at entry point VALCHP
at line number 575 in file USERS3:[MAILLARD.GEC]PB.FOR;1

            CALL FDV$GETAL (,RETKEY,NOMS(CODCHP),IND )
....................................^
%FORT-W-NOVALUE, No value
at line number 533 in file USERS3:[MAILLARD.GEC]PB.FOR;1

            CALL FDV$GETAL (,RETKEY,NOMS(CODCHP),IND )
....................................^
%FORT-W-NOEPDEFDA, No entry point leading to this statement defines dummy argument NOMS
at line number 533 in file USERS3:[MAILLARD.GEC]PB.FOR;1

            CALL FDV$GETAL (,RETKEY,NOMS(CODCHP),IND )
....................................^
%FORT-W-NOEPDEFDA, No entry point leading to this statement defines dummy argument NOMS
at line number 533 in file USERS3:[MAILLARD.GEC]PB.FOR;1

       CALL TGETTAB( FORMS, SFORMS)
.....................^
%FORT-W-DAUNDEFEP, Dummy argument FORMS is undefined at entry point N2TECR
at line number 438 in file USERS3:[MAILLARD.GEC]PB.FOR;1

       CALL TGETTAB( FORMS, SFORMS)
.....................^
%FORT-W-NOVALUE, No value
at line number 438 in file USERS3:[MAILLARD.GEC]PB.FOR;1

       CALL TGETTAB( FORMS, SFORMS)
.....................^
%FORT-W-DAUNDEFEP, Dummy argument FORMS is undefined at entry point N2TECR
at line number 438 in file USERS3:[MAILLARD.GEC]PB.FOR;1

       CALL TGETTAB( SAVS, SSAVS)
.....................^
%FORT-W-DAUNDEFEP, Dummy argument SAVS is undefined at entry point MODECR
at line number 337 in file USERS3:[MAILLARD.GEC]PB.FOR;1

========================================================================
		Include file C_DEFKEY.INC
========================================================================
C
C     Commun "DEFKEY"
C     Contient les numeros des differentes touches fonction
C     utilisables sur un ecran a un moment donne
C
C     NBR_MAXKEY : Nombre de touches valides
C     TAB_VALKEY : Table contenant les numeros des touches valides
C     VAL_RETKEY : Numero de la touche saisie par l'utilisateur
C                   ( mis a jour par l'UAR UVALKEY )
C
C
      INTEGER      NBR_MAXKEY, VAL_RETKEY,TAB_VALKEY(30),LASTKEY
      CHARACTER *1 FLG_VAL
C
      COMMON /DEFKEY/ NBR_MAXKEY, TAB_VALKEY, VAL_RETKEY , LASTKEY,
     &                FLG_VAL
========================================================================
		Include file C_ERRNUM.INC
========================================================================
C
C     Commun  "ERRNUM"
C     Contient les status des differentes erreurs
C        TAB_STATUS : Status de retour pour les acces aux tables
C        IO_STATUS  :   "    "    "    pour les entrees/sorties
C        FMS_STATUS : Status d'erreur FMS
C        RMS_STATUS :   "       "     RMS
C        CUR_STATUS : Flag logique indiquant le statut d'erreur courant
C        GEN_STATUS :   "     "       "      "    "       "     general
C
      INTEGER *2 TAB_STATUS, IO_STATUS            
      INTEGER *4 FMS_STATUS, RMS_STATUS
      LOGICAL CUR_STATUS, GEN_STATUS
      COMMON /ERRNUM/ TAB_STATUS, IO_STATUS, FMS_STATUS, RMS_STATUS,
     1                CUR_STATUS, GEN_STATUS 
========================================================================
		Include file C_FDVDEF.INC
========================================================================
C
C     Commun  FDVDEF
C     Contient les valeurs des touches du clavier
C     ainsi que les codes retour des UAR
C
C                Touches PF1_X  (  X =  1 --> 9 )
C
      INTEGER    FDV$K_G_0, FDV$K_G_1, FDV$K_G_2, FDV$K_G_3,
     1           FDV$K_G_4, FDV$K_G_5, FDV$K_G_6, FDV$K_G_7,
     2           FDV$K_G_8, FDV$K_G_9, FDV$K_G_MNS,
     3           FDV$K_G_EQ
C
C                Touches PF1_X  (  X =  A --> Z )
C
      INTEGER    FDV$K_G_A, FDV$K_G_B, FDV$K_G_C, FDV$K_G_D,
     1           FDV$K_G_E, FDV$K_G_F, FDV$K_G_G, FDV$K_G_H,
     2           FDV$K_G_I, FDV$K_G_J, FDV$K_G_K, FDV$K_G_L,
     3           FDV$K_G_M, FDV$K_G_N, FDV$K_G_O, FDV$K_G_P,
     4           FDV$K_G_Q, FDV$K_G_R, FDV$K_G_S, FDV$K_G_T,
     5           FDV$K_G_U, FDV$K_G_V, FDV$K_G_W, FDV$K_G_X,
     6           FDV$K_G_Y, FDV$K_G_Z
C
C                Touches "Fonctions" ( F7,F8,F9,F10,F17,F18,F19,F20,
C                                      TABULATION,BACKTAB,UP ARROW,
C                                      DOWN ARROW,AUTOTAB )
C
      INTEGER    PGP, PGS, ECP, ECS, VAL, PPG, REI, ABD, NXT, PRV,
     1           TAB, BKT, UPA, DNA, AUT
C
C                Codes retour des UAR
C
      INTEGER    FDV$K_UVAL_FAIL, FDV$K_UVAL_END,
     1           FDV$K_UKEY_ERR, FDV$K_UKEY_TRM,  FDV$K_UKEY_NXT,
     2           FDV$K_UKEY_NTR, FDV$K_UKEY_SUC
C
C                Code retour d'erreur
C
      INTEGER    FDV$_SUC, FDV$_MOD
C
C                Workspace des ecrans d'aide
C
      CHARACTER *2000  HLP_WORKSPACE
C
      COMMON/FDVDEF/FDV$K_G_0, FDV$K_G_1, FDV$K_G_2, FDV$K_G_3,
     1              FDV$K_G_4, FDV$K_G_5, FDV$K_G_6, FDV$K_G_7,
     2              FDV$K_G_8, FDV$K_G_9, FDV$K_G_MNS, FDV$K_G_EQ,
     3              FDV$K_G_A, FDV$K_G_B, FDV$K_G_C, FDV$K_G_D,
     4              FDV$K_G_E, FDV$K_G_F, FDV$K_G_G, FDV$K_G_H,
     5              FDV$K_G_I, FDV$K_G_J, FDV$K_G_K, FDV$K_G_L,
     6              FDV$K_G_M, FDV$K_G_N, FDV$K_G_O, FDV$K_G_P,
     7              FDV$K_G_Q, FDV$K_G_R, FDV$K_G_S, FDV$K_G_T,
     8              FDV$K_G_U, FDV$K_G_V, FDV$K_G_W, FDV$K_G_X,
     9              FDV$K_G_Y, FDV$K_G_Z, TAB, BKT, UPA, DNA,
     A              PGP, PGS, ECP, ECS, VAL, PPG, REI, ABD, NXT, PRV,
     B              AUT, FDV$K_UVAL_FAIL, FDV$K_UVAL_END,
     C              FDV$K_UKEY_ERR, FDV$K_UKEY_TRM,  FDV$K_UKEY_NXT,
     D              FDV$K_UKEY_NTR, FDV$K_UKEY_SUC, FDV$_SUC, FDV$_MOD
========================================================================
		Include file G_ECRAPP.INC
========================================================================
C
      INTEGER  CECR_A
      PARAMETER ( CECR_A = 1 )
C
      INTEGER  CECR_LA
      PARAMETER ( CECR_LA = 2 )
C
      INTEGER  CECR_L
      PARAMETER ( CECR_L = 3 )
C
      INTEGER  CECR_TXT
      PARAMETER ( CECR_TXT = 4 )
C
      INTEGER  CECR_ENTNOR
      PARAMETER ( CECR_ENTNOR = 5 )
C
      INTEGER  CECR_RELNOR
      PARAMETER ( CECR_RELNOR = 6 )
C
      INTEGER CECR_VIDNOR
      PARAMETER ( CECR_VIDNOR = -1)
C
      INTEGER CECR_VIDERR
      PARAMETER ( CECR_VIDERR = 13)
C
      INTEGER CECR_SUCCES
      PARAMETER ( CECR_SUCCES = 1000 )   ! CODE SUCCES = FDV$K_UVAL_SUC 
C
      INTEGER CECR_ECHEC
      PARAMETER ( CECR_ECHEC  = 1001 )   ! CODE ECHEC = FDV$K_UVAL_FAIL 
========================================================================
		Problem Module PB.FOR
========================================================================
       !
       SUBROUTINE ECRSTD
       !---------------
       !
       IMPLICIT NONE
       !...Include...
       !-------------
       INCLUDE 'C_ERRNUM.INC'
       INCLUDE 'C_FDVDEF.INC'
       INCLUDE 'C_DEFKEY.INC'
       INCLUDE 'G_ECRAPP.INC'
       !
       !... Arguments
       !
       INTEGER ANBZON       !..Nombre de zones dans l'ecran..
       !
       !... Variables de travail
       !
       LOGICAL FLGINIT      !..Flag de reinisialisation 
       LOGICAL FLGFIRST     !..Flag de premier passage dans un ecran
       LOGICAL FLGWAIT      !..Flag d'attente apres un message d'information
       LOGICAL TROUVE       !..Recherche du nom courant
       !
       INTEGER I            !..Compteurs..
       INTEGER IND          !..Indice de position dans une serie de meme noms..
       INTEGER IND_DEB      !..Indice de debut dans VALS du texte du champ courant ..
       INTEGER IND_FIN      !..Indice de fin dans VALS du texte du champ courant ..
       INTEGER NBZON        !..Nombre de zones dans l'ecran..
       INTEGER TECR         !..Taille memoire allouee a l'ecran..
       INTEGER CODCHP       !..Indice de tableau.. 
       INTEGER RESULT       !..Code de comparaison entre valeur et sauvegarde..
       INTEGER RETKEY       !..Code de la touche entree par l'utilisateur..
       INTEGER POSCUR       !..Position du curseur..
       INTEGER NUMCUR       !..Entier courant (retourne par NUMCHP)..
       REAL    RELCUR       !..Reel courant (retourne par RELCHP)..
       INTEGER TYPCUR       !..Type courant (retourne par TYPCHP)..
       INTEGER CODVID
       INTEGER BLINKBOLD    !..Attribut video... 
       !
       CHARACTER *80  NOMCUR !..Nom du champ courant retourne par FMS
       CHARACTER *(*) NECR   !..Nom de l'ecran a charger..
       CHARACTER *(*) WSP
       CHARACTER *80  STRING !..Variable de travail..
       !
       !...Tableau des infomatons textuelles 
       !    des champs d'un ecran...
       !------------------------------------
       !...
       CHARACTER *(*) VALS
       DIMENSION      VALS(*)
       INTEGER        SVALS
       DIMENSION      SVALS( 2)
       !
       CHARACTER *(*) VALCUR
       !
       !...Tableau de sauvegarde des valeurs affichees...
       !-------------------------------------------------
       !
       CHARACTER *(*) SAVS
       DIMENSION      SAVS(*)
       INTEGER        SSAVS
       DIMENSION      SSAVS(2)
       !
       !...Tableau des noms de zones d'ecran FMS...
       !-------------------------------------------
       !
       CHARACTER *(*) NOMS
       DIMENSION      NOMS(*)
       INTEGER        SNOMS
       DIMENSION      SNOMS(2)
       !
       !...Tableau de controle des ecritures :
       !    affichable ou lecture/affichable...
       !---------------------------------------
       !
       INTEGER   AECRS
       DIMENSION AECRS(*)
       INTEGER   ECRS
       DIMENSION ECRS(1000)
       POINTER   (SECRS, ECRS)
       !
       !...Tableau d'indice de champs de meme noms...
       !---------------------------------------------
       !
       INTEGER   AINDS
       DIMENSION AINDS(*)
       INTEGER   INDS
       DIMENSION INDS(1000)
       POINTER   (SINDS, INDS)
       !
       !...Tableau des valeurs numeriques INTEGER...
       !--------------------------------------------
       !
       INTEGER   ANUMS
       DIMENSION ANUMS(*)
       INTEGER    NUMS
       DIMENSION  NUMS( 1000)
       POINTER   (SNUMS, NUMS)
       !
       !...Tableau des valeurs numeriques REAL...
       !--------------------------------------------
       !
       REAL      ARELS
       DIMENSION ARELS(*)
       REAL       RELS
       DIMENSION  RELS(1000)
       POINTER   (SRELS, RELS)
       !
       !...Tableau de type des champs : numerique ou caractere...
       !---------------------------------------------------------
       !
       INTEGER   ATYPS
       DIMENSION ATYPS(*)
       INTEGER   TYPS
       DIMENSION TYPS(1000)
       POINTER   (STYPS, TYPS)
       !
       !...Tableau de taille des champs.
       !--------------------------------
       !
       INTEGER   ASIZS
       DIMENSION ASIZS(*)
       INTEGER   SIZS
       DIMENSION SIZS(1000)
       POINTER   (SSIZS, SIZS)
       !
       !...Tableau des formes pour les conversions... 
       !---------------------------------------------
       !
       CHARACTER *(*) FORMS
       DIMENSION      FORMS(*)
       INTEGER        SFORMS
       DIMENSION      SFORMS(2)
       !
       !...Libelle du message...
       !------------------------
       !
       CHARACTER *(*) LIBL
       !
       SAVE 
C---------------------------------------------------------------------
       !
       !==============================================================
       !               INITIALISATION D'UN ECRAN                     =
       !==============================================================
       !
       ENTRY INIECR( FLGFIRST,ANBZON, TECR, NECR, WSP,VALS,SAVS,NOMS,
     &               AECRS,AINDS,FORMS,ANUMS,ARELS,ATYPS,ASIZS, *)
       !-------------------------------------------------------------
       !
       NBZON    = ANBZON
       IF ( FLGFIRST ) THEN
          CALL FDV$AWKSP( WSP, TECR)
          IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
          CALL FDV$LOAD( NECR)
          IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
       ELSE
          CALL FDV$SWKSP ( WSP )
          IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
       ENDIF
       !
       CALL TSAVTAB( VALS, SVALS)
       CALL TSAVTAB( SAVS, SSAVS)
       CALL TSAVTAB( NOMS, SNOMS)
       CALL TSAVTAB( FORMS, SFORMS)
       CALL NSAVTAB( AINDS, SINDS)
       CALL NSAVTAB( AECRS, SECRS)
       CALL NSAVTAB( ANUMS, SNUMS)
       CALL NSAVTAB( ARELS, SRELS)
       CALL NSAVTAB( ATYPS, STYPS)
       CALL NSAVTAB( ASIZS, SSIZS)
       !
       !..fin..
       !
       RETURN
       !
C---------------------------------------------------------------------
       !
       !==============================================================
       !               TERMINAISON D'UN ECRAN                        =
       !==============================================================
       !
       ENTRY FINECR( WSP, * )
       !---------------------
       !
       !
       CALL FDV$DWKSP ( WSP )
       IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
       !
       !..fin..
       !
       RETURN
       !
C--------------------------------------------------------------------
       !=============================================================
       !               ROUTINES D'ECRITURE                          =
       !=============================================================
       !
       !
       ENTRY ECRECR( * )
       !----------------------------------------------
       !
       ! Affichage des zones ecrans
       !
       CALL NGETTAB( ECRS, SECRS)
       CALL TGETTAB( SAVS, SSAVS)
       CALL NGETTAB( NUMS, SNUMS)
       CALL NGETTAB( RELS, SRELS)
       CALL TGETTAB( VALS, SVALS)
       CALL NGETTAB( INDS, SINDS)
       CALL NGETTAB( SIZS, SSIZS)
       CALL TGETTAB( NOMS, SNOMS)
C 
       DO I = 1, NBZON
           IF ( ECRS(I) .EQ. CECR_A .OR.
     1          ECRS(I) .EQ. CECR_LA )
     2     THEN
             IF ( INDS( I) .EQ. 0) THEN
                 IND_DEB = 1
                 IND_FIN = SIZS( I)
                 POSCUR  = I
             ELSE
                 IF ( INDS( I) .EQ. 1) THEN
                     POSCUR = I
                 END IF
                 IND_DEB = ( ( I - POSCUR) * SIZS( I)) + 1
                 IND_FIN = IND_DEB + SIZS( I) - 1
             END IF
             IF ( (SAVS(POSCUR)(IND_DEB:IND_FIN) .NE.
     1             VALS(POSCUR)(IND_DEB:IND_FIN)) .OR. FLGINIT )
     2       THEN
               IF (( TYPS(I) .EQ. CECR_ENTNOR .AND. 
     &               NUMS(I) .EQ. 0)          .OR.
     &             ( TYPS(I) .EQ. CECR_RELNOR .AND.
     &               RELS(I) .EQ. 0.0) ) 
     &         THEN
                   CALL FDV$PUTD( NOMS(I),INDS(I) )
               ELSE
                   CALL FDV$PUT( VALS(POSCUR)(IND_DEB:IND_FIN ), 
     1                           NOMS( I), INDS(I))
               ENDIF
               IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
             END IF
           ENDIF
       END DO
       !
       ! Copie des VALS dans SAVS
       !
       DO I = 1, NBZON
           SAVS( I) = VALS( I)
       END DO
       !
       FLGINIT = .FALSE.
       !..fin..
       !
       RETURN
       !
C---------------------------------------------------------------------
       !
       !==============================================================
       !                    ROUTINES DE LECTURE
       !==============================================================
       !
       ENTRY LITECR( * )                     
       !---------------------------------------
       !
       ! Restauration du contexte
       !
       CALL TGETTAB( VALS, SVALS)
       CALL TGETTAB( NOMS, SNOMS)
       CALL NGETTAB( INDS, SINDS)
       CALL NGETTAB( SIZS, SSIZS)
       CALL NGETTAB( ECRS, SECRS)
       !
       DO I = 1, NBZON
           IF (    (ECRS(I) .EQ. CECR_L) 
     1        .OR. (ECRS(I) .EQ. CECR_LA)) 
     2     THEN
               IF ( INDS( I) .EQ. 0) THEN
                   IND_DEB = 1
                   IND_FIN = SIZS( I)
                   POSCUR  = I
               ELSE
                   IF ( INDS( I) .EQ. 1) THEN
                       POSCUR = I
                   END IF
                   IND_DEB = ( ( I - POSCUR) * SIZS( I)) + 1
                   IND_FIN = IND_DEB + SIZS( I) - 1
               END IF
       !
               CALL FDV$RET( VALS( POSCUR)(IND_DEB: IND_FIN), 
     1                       NOMS( I), INDS( I))
               IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
           ENDIF
       END DO
       !
       !..fin..
       !
       RETURN
       !
C---------------------------------------------------------------------
       !
       !==============================================================
       !             ROUTINES DE TEST DE MODIFICATION
       !==============================================================
       !
       ENTRY MODECR( RESULT, IND )
       !--------------------------------------------------
       !
       ! Restauration du contexte
       !
       CALL TGETTAB( VALS, SVALS)
       CALL TGETTAB( NOMS, SNOMS)
       CALL NGETTAB( INDS, SINDS)
       CALL NGETTAB( ECRS, SECRS)
       CALL NGETTAB( SIZS, SSIZS)
       CALL TGETTAB( SAVS, SSAVS)
       !
       RESULT = 0
       IND    = 0
       I      = 1
       DO WHILE ((RESULT.EQ.0) .AND. (I.LE.NBZON))
           IF( ECRS( I).EQ.CECR_L .OR. ECRS( I).EQ.CECR_LA) THEN
               IF ( INDS( I) .EQ. 0) THEN
                   IND_DEB = 1
                   IND_FIN = SIZS( I)
                   POSCUR  = I
               ELSE
                   IF ( INDS( I) .EQ. 1) THEN
                       POSCUR = I
                   END IF
                   IND_DEB = ( ( I - POSCUR) * SIZS( I)) + 1
                   IND_FIN = IND_DEB + SIZS( I) - 1
               END IF
               IF ( VALS( POSCUR)( IND_DEB:IND_FIN) .EQ.
     1              SAVS( POSCUR)( IND_DEB:IND_FIN) )
     2         THEN
                   RESULT = I
               END IF
           ENDIF
           I = I + 1
       END DO
       !
       IF (RESULT.NE.0) THEN
           IND    = INDS( RESULT)
           RESULT = RESULT + 1 - IND
       ENDIF
       !
       !..fin..
       !
       RETURN
       !
       !
C---------------------------------------------------------------------
       !
       !==============================================================
       !                  ROUTINES DE CONVERSION
       !==============================================================
       !--------------------------------------------------------------
       !      Conversion de tous les champ d'un ecran de type texte 
       !       en type numerique 
       !--------------------------------------------------------------
       !
       ENTRY T2NECR ()
       !-------------------------------------
       !
       ! Restauration du contexte
       !
       CALL TGETTAB( VALS, SVALS)
       CALL NGETTAB( NUMS, SNUMS)
       CALL NGETTAB( RELS, SRELS)
       CALL TGETTAB( FORMS, SFORMS)
       CALL NGETTAB( TYPS, STYPS)
       !
       DO I = 1, NBZON
           IF ( INDS( I) .EQ. 0) THEN
               IND_DEB = 1
               IND_FIN = SIZS( I)
               POSCUR  = I
           ELSE
               IF ( INDS( I) .EQ. 1) THEN
                   POSCUR = I
               END IF
               IND_DEB = ( ( I - POSCUR) * SIZS( I)) + 1
               IND_FIN = IND_DEB + SIZS( I) - 1
           END IF
           !
           IF       (TYPS(I) .EQ. CECR_ENTNOR) THEN
               READ( VALS(POSCUR)(IND_DEB:IND_FIN), FORMS(I),ERR=4000)  
     &                                                         NUMS(I)  
           ELSE IF (TYPS(I) .EQ. CECR_RELNOR) THEN
               CALL ADDDOT( VALS( POSCUR)( IND_DEB:IND_FIN),
     1                      FORMS( I), STRING)
               READ( STRING, FORMS(I),ERR=4000 )  RELS(I)  
           ENDIF
       !
4000   CONTINUE
       !
       END DO
       !
       !..fin..
       !
       RETURN
       !
       !--------------------------------------------------------------
       ! Conversion de tous les champ d'un ecran de type  
       !  numerique en type texte 
       !---------------------------------------------------------------
       !
       ENTRY N2TECR ()
       !-------------------------------------
       !
       ! Restauration du contexte
       !
       CALL TGETTAB( VALS, SVALS)
       CALL NGETTAB( NUMS, SNUMS)
       CALL NGETTAB( RELS, SRELS)
       CALL TGETTAB( FORMS, SFORMS)
       CALL NGETTAB( TYPS, STYPS)
       CALL NGETTAB( SIZS, SSIZS)
       !
       DO I = 1, NBZON
           IF ( INDS( I) .EQ. 0) THEN
               IND_DEB = 1
               IND_FIN = SIZS( I)
               POSCUR  = I
           ELSE
               IF ( INDS( I) .EQ. 1) THEN
                   POSCUR = I
               END IF
               IND_DEB = ( ( I - POSCUR) * SIZS( I)) + 1
               IND_FIN = IND_DEB + SIZS( I) - 1
           END IF
           !
           IF (TYPS(I) .EQ. CECR_ENTNOR ) THEN
                WRITE( VALS( POSCUR)(IND_DEB:IND_FIN),FORMS(I),
     1                   ERR=1000) NUMS(I)
           ELSE IF (TYPS(I) .EQ. CECR_RELNOR) THEN
                !
                WRITE( STRING, FORMS(I),ERR=1000 )  RELS(I)
                CALL REMDOT( STRING, FORMS( I),
     1                      VALS( POSCUR)( IND_DEB:IND_FIN) ) 
           ENDIF
       !
1000   CONTINUE
       !
       END DO
       !
       !..fin..
       !
       RETURN
       !
C---------------------------------------------------------------------
       !
       !==============================================================
       !                     LA VIDEO
       !==============================================================
       !
       !--------------------------------------------------------------
       ! Routine de changement d'attribut VIDEO pour tous les 
       !  champs d'un ecran
       !--------------------------------------------------------------
       !
       ENTRY VIDECR ( BLINKBOLD,* )
       !------------------------------------------
       !
       ! Restauration du contexte
       !
       CALL NGETTAB( INDS, SINDS)
       CALL NGETTAB( ECRS, SECRS)
       CALL TGETTAB( NOMS, SNOMS)
       !
       DO I = 1,NBZON
          IF ( ECRS(I) .EQ. CECR_LA )  THEN
            CALL FDV$AFVA ( BLINKBOLD ,NOMS(I),INDS(I) )
            IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
          ENDIF
       END DO  
       !
       !..fin..
       !
       RETURN
       !
C---------------------------------------------------------------------
       !
       !==============================================================
       !                AFFICHAGE D'UN ECRAN
       !==============================================================
       !
       ENTRY AFFECR (*)
       !---------------
       !
       CALL FDV$DISP
       IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
       CALL FDV$DISPW
       IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
       !
       RETURN
       !
C----------------------------------------------------------------------
       !
       !==============================================================
       !                     DIALOGUE AVEC UN ECRAN
       !==============================================================
       !
       ENTRY DIAECR ( LIBL,RETKEY,CODCHP,IND,* )
       !----------------------------------------
       !
       LASTKEY = -1
       IF ( CODCHP .NE. 0 ) THEN
            CALL FDV$PUTL ( LIBL )
            IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
            CALL FDV$GETAL (,RETKEY,NOMS(CODCHP),IND )
       ELSE 
            CALL FDV$GETAL (,RETKEY )
       ENDIF
       IF (LASTKEY .GE. 0) THEN
         RETKEY  = LASTKEY
         LASTKEY = -1
       ENDIF
       IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
       !
       !..fin..
       !
       RETURN
       !
       !
C----------------------------------------------------------------------
       !
       !==============================================================
       !      DIALOGUE AVEC UN ECRAN, AFFICHAGE D'UN MESSAGE
       !==============================================================
       !
       ENTRY MSGECR ( LIBL,FLGWAIT,* )
       !----------------------
       !
       CALL FDV$PUTL ( LIBL )
       IF (FMS_STATUS .NE. FDV$_SUC) RETURN 1
       !
       IF ( FLGWAIT ) CALL FDV$WAIT
       !
       !..fin..
       !
       RETURN
       !
       !
       !==============================================================
       !      VALEUR TEXTUELLE DU CHAMP DESIGNE PAR POSCUR, INDCUR
       !==============================================================
       !
       ENTRY VALCHP( CODCHP, IND, VALCUR )
       !
       ! Restauration du contexte
       !
       CALL TGETTAB( VALS, SVALS)
       CALL NGETTAB( INDS, SINDS)
       CALL NGETTAB( SIZS, SSIZS)
       !
       I      = CODCHP
       IF (INDS( CODCHP).NE.0) THEN
           I  = CODCHP + IND - 1
       ENDIF
       !
       IF ( INDS( I) .EQ. 0) THEN
           IND_DEB = 1
           IND_FIN = SIZS( I)
       ELSE
           IND_DEB = ( ( I - CODCHP) * SIZS( I)) + 1
           IND_FIN = IND_DEB + SIZS( I) - 1
       END IF
       !
       IF (INDS(  POSCUR) .NE. 0) THEN
           CODCHP = CODCHP + IND
       END IF 
       VALCUR = VALS( CODCHP)( IND_DEB:IND_FIN)
       !
       RETURN
       !
       !==============================================================
       !      VALEUR NUMERIQUE DU CHAMP DESIGNE PAR POSCUR, INDCUR
       !==============================================================
       !
       ENTRY NUMCHP( CODCHP, IND, NUMCUR)
       !
       CALL NGETTAB( NUMS, SNUMS)
       CALL NGETTAB( INDS, SINDS)
       CALL NGETTAB( SIZS, SSIZS)
       !
       I      = CODCHP
       IF (INDS( CODCHP).NE.0) THEN
           I  = CODCHP + IND - 1
       ENDIF
       !
       NUMCUR = NUMS( I)
       !
       RETURN
       !
       !
       !==============================================================
       !      REINITIALISATION DES VALEURS D'UN ECRAN
       !==============================================================
       !
       ENTRY RSTECR
       !
       !CALL TGETTAB( VALS, SVALS)
       !CALL TGETTAB( SAVS, SSAVS)
       !CALL NGETTAB( NUMS, SNUMS)
       !CALL NGETTAB( RELS, SRELS)
       !CALL NGETTAB( INDS, SINDS)
       !CALL NGETTAB( SIZS, SSIZS)
       !
       FLGINIT = .TRUE.
       !
       DO I = 1, NBZON
           IF ( INDS( I) .EQ. 0) THEN
               IND_DEB = 1
               IND_FIN = SIZS( I)
               POSCUR  = I
           ELSE
               IF ( INDS( I) .EQ. 1) THEN
                   POSCUR = I
               END IF
               IND_DEB = ( ( I - POSCUR) * SIZS( I)) + 1
               IND_FIN = IND_DEB + SIZS( I) - 1
           END IF
           VALS( POSCUR)( IND_DEB:IND_FIN) = ' '
           SAVS( POSCUR)( IND_DEB:IND_FIN) = ' '
           NUMS( I) = 0
           RELS( I) = 0
       END DO
       !
       RETURN
       !
C----------------------------------------------------------------------
       !
       !==============================================================
       !      DIALOGUE AVEC UN ECRAN,
       !==============================================================
       !
       ENTRY WAITECR ( RETKEY )
       !----------------------
       !
       !
       LASTKEY = -1
       CALL FDV$WAIT ( RETKEY )
       IF (LASTKEY .GE. 0) THEN
         RETKEY  = LASTKEY
         LASTKEY = -1
       ENDIF
       !
       !..fin..
       !
       RETURN
       !
       !
C--------.Fin.---------------------------------------------------------
       !
       END

      !
      !
      !------------------------------
      !..Sauvegarde du descripteur  
      !  d'un tableau de type texte
      !------------------------------
      !
      SUBROUTINE TSAVTAB ( TTAB , STTAB )
      INTEGER TTAB(2)
      INTEGER STTAB(2)
      !
      STTAB(1) = TTAB(1)
      STTAB(2) = TTAB(2)
      !
      END
      !
      !------------------------------
      !..Sauvegarde de l'adresse d'un 
      !  tableau de type numerique
      !------------------------------
      !
      SUBROUTINE NSAVTAB ( NTAB , SNTAB )
      INTEGER NTAB
      INTEGER SNTAB
      !
      SNTAB = %LOC(NTAB)
      !
      END
C---------------------------------------
      !
      !------------------------------
      !..Restore du descripteur  
      !  d'un tableau de type texte
      !------------------------------
      !
      SUBROUTINE NGETTAB ( NTAB , SNTAB )
      INTEGER NTAB
      INTEGER SNTAB
      !
C      NTAB = SNTAB
      !
      END
      !
      !------------------------------
      !..Restore du descripteur  
      !  d'un tableau de type numerique
      !------------------------------
      !
      SUBROUTINE TGETTAB ( TTAB , STTAB )
      INTEGER TTAB(2)
      INTEGER STTAB(2)
      !
      TTAB(1) = STTAB(1)
      TTAB(2) = STTAB(2)
      !
      END
T.RTitleUserPersonal
Name
DateLines
1210.1Invalid programQUARK::LIONELFree advice is worth every centWed Mar 05 1997 09:5352
The problem is that the program is illegal Fortran, but the VAX compiler doesn't
detect this and it just "happens" to work.

The first error encountered (first two error messages) are in regards to the
following section of code:

       ENTRY RSTECR
       !
       !CALL TGETTAB( VALS, SVALS)
       !CALL TGETTAB( SAVS, SSAVS)
       !CALL NGETTAB( NUMS, SNUMS)
       !CALL NGETTAB( RELS, SRELS)
       !CALL NGETTAB( INDS, SINDS)
       !CALL NGETTAB( SIZS, SSIZS)
       !
       FLGINIT = .TRUE.
       !
       DO I = 1, NBZON
           IF ( INDS( I) .EQ. 0) THEN
               IND_DEB = 1
               IND_FIN = SIZS( I)
               POSCUR  = I
           ELSE
               IF ( INDS( I) .EQ. 1) THEN
                   POSCUR = I
               END IF
               IND_DEB = ( ( I - POSCUR) * SIZS( I)) + 1
               IND_FIN = IND_DEB + SIZS( I) - 1
           END IF
           VALS( POSCUR)( IND_DEB:IND_FIN) = ' '
           SAVS( POSCUR)( IND_DEB:IND_FIN) = ' '
           NUMS( I) = 0
           RELS( I) = 0
       END DO
       !
       RETURN

The compiler is complaining that VALS (and later SAVS) are not dummy arguments
to ENTRY point RSTECR and that there is no path to the statements using them
from any entry point which DOES include these in its argument list.  You are
not allowed to use a dummy argument unless it was present in the argument list
of the entry point through which you entered.  It works on VAX as a side-effect
of the way that the VAX compiler implements entry points, but it is not
supported (and indeed the VAX documentation explicitly says you can't do this.)
The VAX compiler's analysis isn't as sophisticated as the Alpha compiler's,
so it can't figure this out.

All of the other error messages are due to the same sort of coding error.
A possible workaround is to put these variables in COMMON, but I don't know
how this fits in with the larger application.

					Steve
1210.2PRSSOS::MAILLARDDenis MAILLARDWed Mar 05 1997 10:094
    Re .1: Thanks a lot, Steve. I unfortunately do not know enough Fortran
    to understand clearly the meaning of the messages, but now I know how
    to handle this.
    		Denis.
1210.3QUARK::LIONELFree advice is worth every centWed Mar 05 1997 11:123
That's what we're here for.

			Steve
1210.4TLE::EKLUNDAlways smiling on the inside!Wed Mar 05 1997 13:0627
    	Actually there are other problems as well, some of which
    may not have easy solutions.  Steve is correct in what he
    offers, but the dummy arguments are declared character*(*),
    which is the most difficult case to handle.  Steve's
    suggestion of putting the variables in COMMON is a very good
    one, if possible.  The other obvious problem is that there
    are actual arguments with different types than their
    corresponding formal arguments.  In particular, you might
    look at TGETTAB is called (character argument!?).  Using
    /warn=argument may help to identify some of the problems.
    You will find, for example, that a pointer on AVMS is an
    integer*8 variable instead of integer*4 on VAX.
    
    	I'm afraid that this program is due for some major
    changes.  It was depending upon arguments being "preserved"
    across calls to a routine (and its ENTRY points), and this
    simply does NOT happen.
    
    Cheers!
    Dave Eklund
    
    PS Feel free to ask more questions.  Because of how the
    program is written, we suspect it will NOT be easy to fix
    the problems we mentioned.
    
    Dave E