FIX: Incorrect Results Using Array Element in IBSET FunctionLast reviewed: September 11, 1997Article ID: Q72490 |
4.01 4.10 5.00 5.10 | 4.10 5.00 5.10
MS-DOS | OS/2kbtool kbbuglist kbfixlist kbcode The information in this article applies to:
SYMPTOMSAn application provides incorrect results. When the application is compiled with Microsoft FORTRAN version 4.0 for MS-DOS, it provides correct results.
CAUSEThe application stores an array in a COMMON block. The application uses as an array subscript a variable that is the first argument to the IBSET intrinsic function. The application assigns to that element the value returned from the IBSET intrinsic function.
RESOLUTIONTo work around this problem, perform one of the following three steps:
STATUSMicrosoft has confirmed this to be a problem in FORTRAN versions 4.01, 4.1, 5.0, and 5.1 for MS-DOS and versions 4.1, 5.0, and 5.1 for OS/2. This problem was corrected in FORTRAN PowerStation, version 1.0.
MORE INFORMATIONThe following code example demonstrates this problem.
Sample Code #1C Compile options needed: None
INTEGER*2 ARR(1) COMMON /BLOC/ ARR I = 1 ARR = 0C Setting bit 0 of 00000000 correctly produces 00000001 (1 decimal).
ARR(I) = IBSET(ARR(I), 0)C Setting bit 1 of 00000001 should produce 00000011 (3 decimal) C but instead produces 00000010 (2 decimal).
ARR(I) = IBSET(ARR(I), 1) WRITE(*, '(1X, ''Result of second IBSET call = '', I1)') ARR ENDThe following code example demonstrates one technique to eliminate this problem. It assigns the array element to a temporary variable and specifies the variable in the IBSET function call.
Sample Code #2C Compile options needed: None
INTEGER*2 ARR(1), TMP COMMON /BLOC/ ARR I = 1 ARR = 0 ARR(I) = IBSET(ARR(I), 0) TMP = ARR(I) ARR(I) = IBSET(TMP, 1) WRITE(*, '(1X, ''Result of second IBSET call = '', I1)') ARR ENDThe following code example demonstrates another technique to eliminate this problem. It places an executable statement between the two IBSET function calls.
Sample Code #3C Compile options needed: None
INTEGER*2 ARR(1) COMMON /BLOC/ ARR I = 1 ARR = 0 ARR(I) = IBSET(ARR(I), 0) WRITE(*, '(1X, ''Result of first IBSET call = '', I1)') ARR ARR(I) = IBSET(ARR(I), 1) WRITE(*, '(1X, ''Result of second IBSET call = '', I1)') ARR END |
Additional reference words: 4.01 4.10 5.00 5.10 buglist4.01 buglist4.10
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |