Table of Contents

Previous: USING PROJECT FILES

## AN EXAMPLE

The following simple Fortran program illustrates the messages given by ftnchek. The program is intended to accept an array of test scores and then compute the average for the series.

    C       AUTHORS: MIKE MYERS AND LUCIA SPAGNUOLO
    C       DATE:    MAY 8, 1989

    C       Variables:
    C               SCORE -> an array of test scores
    C               SUM ->   sum of the test scores
    C               COUNT -> counter of scores read in
    C               I ->     loop counter

            REAL FUNCTION COMPAV(SCORE,COUNT)
                INTEGER SUM,COUNT,J,SCORE(5)

                DO 30 I = 1,COUNT
                    SUM = SUM + SCORE(I)
    30          CONTINUE
                COMPAV = SUM/COUNT
            END

            PROGRAM AVENUM
    C
    C                       MAIN PROGRAM
    C
    C       AUTHOR:   LOIS BIGBIE
    C       DATE:     MAY 15, 1990
    C
    C       Variables:
    C               MAXNOS -> maximum number of input values
    C               NUMS    -> an array of numbers
    C               COUNT   -> exact number of input values
    C               AVG     -> average returned by COMPAV
    C               I       -> loop counter
    C

                PARAMETER(MAXNOS=5)
                INTEGER I, COUNT
                REAL NUMS(MAXNOS), AVG
                COUNT = 0
                DO 80 I = 1,MAXNOS
                    READ (5,*,END=100) NUMS(I)
                    COUNT = COUNT + 1
    80          CONTINUE
    100         AVG = COMPAV(NUMS, COUNT)
            END

The compiler gives no error messages when this program is compiled. Yet here is what happens when it is run:

    $ run average
    70
    90
    85
    <EOF>
    $

What happened? Why didn't the program do anything? The following is the output from ftnchek when it is used to debug the above program:

    $ ftnchek -list -symtab average

    FTNCHEK Version 3.3 November 2004

    File average.f:

          1 C       AUTHORS: MIKE MYERS AND LUCIA SPAGNUOLO
          2 C       DATE:    MAY 8, 1989
          3
          4 C       Variables:
          5 C               SCORE -> an array of test scores
          6 C               SUM ->   sum of the test scores
          7 C               COUNT -> counter of scores read in
          8 C               I ->     loop counter
          9
         10         REAL FUNCTION COMPAV(SCORE,COUNT)
         11             INTEGER SUM,COUNT,J,SCORE(5)
         12
         13             DO 30 I = 1,COUNT
         14                 SUM = SUM + SCORE(I)
         15 30          CONTINUE
         16             COMPAV = SUM/COUNT
                               ^
    Warning near line 16 col 20: integer quotient expr SUM/COUNT  converted to
     real
         17         END

    Module COMPAV: func: real

    Variables:

          Name Type Dims     Name Type Dims     Name Type Dims     Name Type Dims
        COMPAV real         COUNT intg             I intg*            J intg
         SCORE intg  1        SUM intg

    * Variable not declared. Type has been implicitly defined.

    Warning in module COMPAV: Variables declared but never referenced:
        J declared at line 11

    Warning in module COMPAV: Variables may be used before set:
        SUM used at line 14
        SUM set at line 14

    Statement labels defined:

        Label   Line  StmtType
         <30>     15      exec

         18
         19
         20         PROGRAM AVENUM
         21 C
         22 C                       MAIN PROGRAM
         23 C
         24 C       AUTHOR:   LOIS BIGBIE
         25 C       DATE:     MAY 15, 1990
         26 C
         27 C       Variables:
         28 C               MAXNOS -> maximum number of input values
         29 C               NUMS    -> an array of numbers
         30 C               COUNT   -> exact number of input values
         31 C               AVG     -> average returned by COMPAV
         32 C               I       -> loop counter
         33 C
         34
         35             PARAMETER(MAXNOS=5)
         36             INTEGER I, COUNT
         37             REAL NUMS(MAXNOS), AVG
         38             COUNT = 0
         39             DO 80 I = 1,MAXNOS
         40                 READ (5,*,END=100) NUMS(I)
         41                 COUNT = COUNT + 1
         42 80          CONTINUE
         43 100         AVG = COMPAV(NUMS, COUNT)
         44         END

    Module AVENUM: prog

    External subprograms referenced:

        COMPAV: real*

    Variables:

          Name Type Dims     Name Type Dims     Name Type Dims     Name Type Dims
           AVG real         COUNT intg             I intg        MAXNOS intg*
          NUMS real  1

    * Variable not declared. Type has been implicitly defined.

    Warning in module AVENUM: Variables set but never used:
        AVG set at line 43

    I/O Operations:

         Unit ID Unit No. Access Form Operation   Line
                 5          SEQ  FMTD READ         40

    Statement labels defined:

        Label   Line  StmtType    Label   Line  StmtType
         <80>     42      exec    <100>     43      exec

     0 syntax errors detected in file average.f
     6 warnings issued in file average.f

    Warning: Subprogram COMPAV argument data type mismatch at position 1:
        Dummy arg SCORE in module COMPAV line 10 file average.f is type intg
        Actual arg NUMS in module AVENUM line 43 file average.f is type real

According to ftnchek, the program contains variables which may be used before they are assigned an initial value, and variables which are not needed. ftnchek also warns the user that an integer quotient has been converted to a real. This may assist the user in catching an unintended roundoff error. Since the -symtab flag was given, ftnchek prints out a table containing identifiers from the local module and their corresponding datatype and number of dimensions. Finally, ftnchek warns that the function COMPAV is not used with the proper type of arguments.

With ftnchek's help, we can debug the program. We can see that there were the following errors:

1.
  SUM and COUNT should have been converted to real before doing the division.
2.
  SUM should have been initialized to 0 before entering the loop.
3.
  AVG was never printed out after being calculated.
4.
  NUMS should have been declared INTEGER instead of REAL.

We also see that I, not J, should have been declared INTEGER in function COMPAV. Also, MAXNOS was not declared as INTEGER, nor COMPAV as REAL, in program AVENUM. These are not errors, but they may indicate carelessness. As it happened, the default type of these variables coincided with the intended type.

Here is the corrected program, and its output when run:

    C       AUTHORS: MIKE MYERS AND LUCIA SPAGNUOLO
    C       DATE:    MAY 8, 1989
    C
    C       Variables:
    C               SCORE -> an array of test scores
    C               SUM ->   sum of the test scores
    C               COUNT -> counter of scores read in
    C               I ->     loop counter
    C
           REAL FUNCTION COMPAV(SCORE,COUNT)
                INTEGER SUM,COUNT,I,SCORE(5)
    C
                SUM = 0
                DO 30 I = 1,COUNT
                    SUM = SUM + SCORE(I)
    30          CONTINUE
                COMPAV = FLOAT(SUM)/FLOAT(COUNT)
            END
    C
    C
            PROGRAM AVENUM
    C
    C                       MAIN PROGRAM
    C
    C       AUTHOR:   LOIS BIGBIE
    C       DATE:     MAY 15, 1990
    C
    C       Variables:
    C               MAXNOS -> maximum number of input values
    C               NUMS    -> an array of numbers
    C               COUNT   -> exact number of input values
    C               AVG     -> average returned by COMPAV
    C               I       -> loop counter
    C
    C
                INTEGER MAXNOS
                PARAMETER(MAXNOS=5)
                INTEGER I, NUMS(MAXNOS), COUNT
                REAL AVG,COMPAV
                COUNT = 0
                DO 80 I = 1,MAXNOS
                    READ (5,*,END=100) NUMS(I)
                    COUNT = COUNT + 1
    80          CONTINUE
    100         AVG = COMPAV(NUMS, COUNT)
                WRITE(6,*) 'AVERAGE =',AVG
            END
    $ run average
    70
    90
    85
    <EOF>
    AVERAGE =   81.66666
    $

With ftnchek's help, our program is a success!

Next: INTERPRETING THE OUTPUT