Microsoft KB Archive/98757

= FIX: Binary (or Unformatted) I/O Fails, Array Size > 64K =

PSS ID Number: 98757

Article Last Modified on 3/24/2000

-

The information in this article applies to:


 * Microsoft FORTRAN PowerStation for MS-DOS 1.0

-



This article was previously published under Q98757



SYMPTOMS
An application developed in Microsoft FORTRAN PowerStation that reads or writes an array larger than 64K in size to a binary or unformatted file may read or write an incorrect quantity of data.



CAUSE
The application specifies the name of an array without a subscript or specifies a simple variable for the subscript. The compiler does not generate the correct code to access the low-level functions that perform binary or unformatted I/O. Consequently, the application reads or writes the amount of data specified by the following formula: (size of array) modulus 64K.



RESOLUTION
To work around this problem, use an explicit implied DO loop in the I/O statement. If the array has only one dimension, the array subscript must be an expression and not a simple variable for the compiler to generate the correct code. If the array is a multi-dimensional array, then the normal, multi-dimensional implied DO loop is sufficient to avoid the problem.



STATUS
Microsoft has confirmed this to be a problem in Microsoft PowerStation version 1.0. This problem has been resolved with FORTRAN PowerStation maintenance release version 1.0a for MS-DOS.

FORTRAN PowerStation version 1.0 can be differentiated from the maintenance release version 1.0a by invoking the linker. Typing &quot;link32 | more&quot; from \F32\BIN directory will show version 2.8 for FORTRAN PowerStation version 1.0, and it will show version 1.0f for the maintenance release version 1.0a.



Sample Code #1
C Compile options needed: none C This program generates the following output C C    Program failed, number of bytes read:           1

parameter(n = 64 * 1024 + 1) ! 64K + 1 size character*1 arr(n), chr integer*4 i

open(1, file = 'test.dat', form = 'binary') arr = 'x'     ! initialize entire array to 'x'     write(1) arr   ! write entire array rewind(1)     ! rewind to read file do i = 1, n       read(1, iostat = ierr) chr ! read a byte at a time if (ierr .eq. -1) exit    ! exit at end of file end do     if (i - 1 .ne. n) then print *, 'Program failed, number of bytes read: ', i - 1 else print *, 'Program OK, number of bytes read: ', i - 1 end if     end

Sample Code #2
C Compile options needed: none C This program generates the following output C C    Program OK, number of bytes read:       65537

parameter(n = 64 * 1024 + 1) ! 64K + 1 size character*1 arr(n), chr integer*4 i

open(1, file = 'test.dat', form = 'binary') arr = 'x'     ! initialize entire array to 'x'     write(1) (arr(i + 0), i = 1, n)   ! note the addition of zero rewind(1)     ! rewind to read file do i = 1, n       read(1, iostat = ierr) chr ! read a byte at a time if (ierr .eq. -1) exit    ! exit at end of file end do     if (i - 1 .ne. n) then print *, 'Program failed, number of bytes read: ', i - 1 else print *, 'Program OK, number of bytes read: ', i - 1 end if     end

Additional query words: 1.00 buglist1.00 fixlist1.00a

Keywords: kbbug KB98757

Technology: kbAudDeveloper kbFORTRANPower100DOS kbFortranSearch kbZNotKeyword3

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© 2004 Microsoft Corporation. All rights reserved.