Fortran: Passing integers to type dimension

Click For Summary
SUMMARY

The Fortran code provided fails to compile due to type mismatch between the main program and the subroutine. In the main program, the array A is declared as INTEGER, while in the subroutine SUBR, the variable A is treated as REAL because the type is not explicitly defined. Fortran's default typing rules dictate that variable names starting with letters I-N are INTEGER, while A-H and O-Z are REAL. To resolve this, the subroutine should declare A as INTEGER, or the main program should pass a REAL type.

PREREQUISITES
  • Understanding Fortran variable typing rules
  • Knowledge of Fortran subroutine parameter passing
  • Familiarity with Fortran's default type conventions
  • Experience with Fortran compilers and their behavior
NEXT STEPS
  • Review Fortran variable declaration and typing conventions
  • Learn about Fortran subroutine parameter passing by address
  • Investigate the differences between INTEGER and REAL types in Fortran
  • Explore compiler-specific behaviors in Fortran regarding type checking
USEFUL FOR

Fortran developers, programmers learning about subroutine parameter handling, and anyone troubleshooting type-related compilation errors in Fortran code.

dimensionless
Messages
461
Reaction score
1
Why does does the following code not compile?

Code:
      PROGRAM TYPES
      INTEGER A(3)      
      A(1)=1
      A(2)=2
      A(3)=3      
      CALL SUBR(A)
      print *,'Done'
      RETURN
      END            
    
C --- Here is a subroutine -----
      SUBROUTINE SUBR(A)
      DIMENSION A(3) 
      RETURN
      END

For some reason it compiles when I change the word "INTERGERS" to "REAL," but it doesn't compile as is.
 
Technology news on Phys.org
In the subroutine A is a REAL variable, since you didn't specify the type.

By default, variable names starting with letters I-N are INTEGER, A-H and O-Z are REAL.

Variables in each subprogram are independent of each other. The variable name A in the subroutine is independent of A in the main program.
 
Also in your comment, you spelled it "INTERGER" a mistake that a co-worker of mine in the 1970's constantly made, then wondered why the variables afterwards became "REAL".

In Fortran, parameters are passed by address, not by value, so the subroutine needs to know that "A" is an integer as well, but doesn't need to know the size, so you could just delcare "INTEGER A(1)" in the subroutine. Most compilers don't check for valid indexes anyway. Regarding passing parameters by address, this was always interesting depending on the compiler:

CALL SUBR(1.0)
A = 1.0
...

SUBROUTINE SUBR(X)
X = 2.0
RETURN
END
 
Last edited:

Similar threads

  • · Replies 20 ·
Replies
20
Views
3K
  • · Replies 25 ·
Replies
25
Views
4K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 5 ·
Replies
5
Views
5K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 59 ·
2
Replies
59
Views
12K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 8 ·
Replies
8
Views
4K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 4 ·
Replies
4
Views
3K