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 2.10 July 1998 
 
 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 converted to real 

      17         END 
      18  
 
 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: Variables declared but never referenced: 
          J          
 
 Warning: Variables may be used before set: 
        SUM          
 
 
      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: Variables set but never used: 
        AVG          
 
 
 
  0 syntax errors detected in file average.f 
  6 warnings issued in file average.f 
 
 Subprogram COMPAV:  argument data type mismatch 
   at position 1: 
     Dummy arg SCORE is type intg  in module COMPAV line 10 file average.f 

     Actual arg NUMS is type real  in module AVENUM line 43 file average.f 

    
  

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. .
  3. SUM should have been initialized to 0 before entering the loop.
  4. .
  5. AVG was never printed out after being calculated.
  6. .
  7. 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