![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: In COBOL, when an '*' is moved to a pic 9 field what conversion is done and what value is now in that pic 9 field? The Answer is : identification division. program-id. w3688. environment division. data division. working-storage section. 01 w1. 02 w2 pic 9 value 5. 01 w3 pic 9 value 6. procedure division. p0. move '*' to w1. display w2 with conversion. move '*' to w3. display w3 with conversion. stop run. From a syntax perspective, you can do a straightforward move to the pic 9 field, and the Compaq COBOL compilers on VAX and Alpha will diagnose the invalid move at compile time (move to w3). However, many programmers use a backdoor approach (move to w1) for many different reasons. The bottom line is that '*' is invalid decimal data, and the results with invalid decimal data are undefined. The undefined results are not 100% consistent between VAX and Alpha. In some cases the VAX hardware does invalid decimal data checking at run time. We added /CHECK=DECIMAL on Alpha to handle some of these cases, but the operation of /CHECK=DECIMAL on Alpha is not 100% compatible with VAX hardware. Note that /CHECK=DECIMAL on Alpha operates when the invalid data is actually used (display with conversion) and not during the move. Compaq COBOL for OpenVMS VAX ------------------------------ $ cobol w3688 12 move '*' to w3. 1 %COBOL-E-ERROR 135, (1) Invalid character in nonnumeric literal moved to numeric item %COBOL-E-ENDDIAGS, COB$USER2:[BRAFFITT.WORK]W3688.COB;1 completed with 1 diagnostic $ link w3688 %LINK-W-WRNERS, compilation warnings in module W3688 file COB$USER2:[BRAFFITT.WORK]W3688.OBJ;1 $ run w3688 Compaq COBOL for OpenVMS Alpha ------------------------------ $ cobol w3688 move '*' to w3. .............^ %COBOL-E-INVCHAR, Invalid character in nonnumeric literal moved to numeric item at line number 12 in file COB$USER2:[BRAFFITT.WORK]W3688.COB;1 %COBOL-E-ENDDIAGS, COB$USER2:[BRAFFITT.WORK]W3688.COB;1 completed with 1 diagnostic $ link w3688 $ run w3688 $ cobol w3688/check=decimal move '*' to w3. .............^ %COBOL-E-INVCHAR, Invalid character in nonnumeric literal moved to numeric item at line number 12 in file COB$USER2:[BRAFFITT.WORK]W3688.COB;1 %COBOL-E-ENDDIAGS, COB$USER2:[BRAFFITT.WORK]W3688.COB;1 completed with 1 diagnostic $ link w3688 $ run w3688 %SYSTEM-F-DECINV, decimal invalid operand, PC=00000000000301D4, PS=0000001B %TRACE-F-TRACEBACK, symbolic stack dump follows image module routine line rel PC abs PC W3688 W3688 W3688 11 00000000000001D4 00000000000301D4
|