Microsoft KB Archive/70243

From BetaArchive Wiki

Article ID: 70243

Article Last Modified on 12/1/2003



APPLIES TO

  • Microsoft FORTRAN Compiler 4.0
  • Microsoft FORTRAN Compiler 4.01
  • Microsoft FORTRAN Compiler 4.1
  • Microsoft FORTRAN Compiler 5.0
  • Microsoft FORTRAN Compiler 5.1
  • Microsoft FORTRAN Compiler 4.1
  • Microsoft FORTRAN Compiler 5.0
  • Microsoft FORTRAN Compiler 5.1



This article was previously published under Q70243

SYMPTOMS

Programs compiled with Microsoft FORTRAN versions 4.0, 4.01, 4.1, and 5.0 that concatenate substrings having a variable for a substring index, can give incorrect results or hang the machine when executed under MS-DOS, or result in a protection violation when executed under OS/2.

CAUSE

The problem is usually observed when the concatenation occurs inside a function call, or inside OPEN or IF statements.

RESOLUTION

To avoid this problem, assign the concatenated expression to a temporary character variable and use the temporary variable in the program.

STATUS

Microsoft has confirmed this to be a problem in FORTRAN versions 4.0, 4.01, 4.1, 5.0, and 5.1. This problem was corrected in FORTRAN PowerStation.

MORE INFORMATION

The following sample programs illustrate the problem:

In an IF Statement

                 character r*2 /'AA'/ 
      n=0

      if ('BBB' .gt. r(1:n+2)//'A') then  ! The IF statement should
                                          ! cause 'YES' to be printed,
                                          ! however 'NO' is printed
                                          ! instead.
         write (*,*) 'YES'
      else
         write (*,*) 'NO'
      endif

      if ('BBB' .gt. r(1:2)//'A') then
         write (*,*) 'YES'
      else
         write (*,*) 'NO'
      endif

      end
                

In a Function

      character*4  a
      character*1  b

      a = 'cdef'
      b = 'd'
      i = len(a)
      print *, i
      j = index('ab'//a(1:i),b)  ! The INDEX function should cause '4'
                                 ! to be printed, however other values
                                 ! are generated instead.
      print *, j
      end
                

Assigning the concatenated expression to a temporary character variable and using the temporary variable in the IF statement or function call will prevent the problem from occurring, as illustrated by the following sample programs:

In an IF Statement

      character r*2 /'AA'/ 

      character str*13             ! Declare a temporary variable and
      str = r(1:n+2)//'A'          ! assign the concatenated expression
                                   ! to it.

      n = 0

      if ('BBB' .gt. str) then     ! Use the temporary variable in
                                   ! the IF statement.

         write (*,*) 'YES'
      else
         write (*,*) 'NO'
      endif

      if ('BBB' .gt. r(1:2)//'A') then
         write (*,*) 'YES'
      else
         write (*,*) 'NO'
      endif

      end
                

In a Function

      character*4  a
      character*1  b
      character*12 str    ! Declare a temporary variable.

      a = 'cdef'
      b = 'd'
      i = len(a)
      print *, i
      str = 'ab'//a(1:i)  ! Assign the concatenated expression
                          ! to the temporary variable.

      j = index(str,b)    ! Use the temporary variable in the
                          ! index function.
      print *, j
      end
                


Additional query words: 5.00

Keywords: kbfix KB70243