FIX: F1001 or Protection Violation, Structure Member Array I/O (69405)



The information in this article applies to:

  • Microsoft FORTRAN Compiler for MS-DOS 5.0
  • Microsoft FORTRAN compiler for OS/2 5.0

This article was previously published under Q69405

SYMPTOMS

An attempt to compile an application in the OS/2 operating system fails and the third pass of the compiler generates a protection violation.

An attempt to compile the application in the MS-DOS operating system fails and the compiler generates the following messages:
warning F4202: (subroutine name) : formal argument : never used
fatal error F1001: Internal Compiler Error
(compiler file '@(#)omf_ms.c:1.118', line 1093)
Contact Microsoft Technical Support
The patched version of F1.EXE, which is designed to correct structure element I/O in subroutines, produces the same results as the unpatched version.

CAUSE

The application passes a structure that contains an array to a subroutine. The subroutine specifies the entire structure element array (no subscript) in an I/O statement.

RESOLUTION

Use an implied-DO list to read or write the entire array.

STATUS

Microsoft has confirmed this to be a problem in FORTRAN version 5.0 for MS-DOS and OS/2. This problem was corrected in FORTRAN version 5.1 for MS-DOS and OS/2.

MORE INFORMATION

The following code example demonstrates this problem.

Sample Code #1

C Compile options needed: None

      STRUCTURE /T/ 
         INTEGER J(100)
      END STRUCTURE
      RECORD /T/ ST
      CALL SUB(ST)
      END
C
      SUBROUTINE SUB(ST)
        STRUCTURE /T/ 
          INTEGER J(100)
        END STRUCTURE
      RECORD /T/ ST
      WRITE(*, *) ST.J    ! Writes an entire array (no subscript).
      END
				
The following code example demonstrates one method to work around this problem.

Sample Code #2

C Compile options needed: None

      STRUCTURE /T/ 
         INTEGER J(100)
      END STRUCTURE
      RECORD /T/ ST
      CALL SUB(ST)
      END

      SUBROUTINE SUB(ST)
        STRUCTURE /T/ 
          INTEGER J(100)
        END STRUCTURE
      RECORD /T/ ST
      WRITE(*,*) (ST.J(I), I = 1, 100) ! Uses an implied DO list.
      END
				

Modification Type:MajorLast Reviewed:10/23/2003
Keywords:kbfix KB69405