Re: Undefined behaviour
- From: "Roger While" <simrw@xxxxxxxxxxxx>
- Date: Tue, 27 May 2008 23:50:38 +0200
"Roger While" <simrw@xxxxxxxxxxxx> schrieb im Newsbeitrag
news:g1hvh3$ner$03$1@xxxxxxxxxxxxxxxxxxxx
Over to the experts -
Quote from the OpenCOBOL forum -
****************************************************************************************
Again, we have a problem with moving numeric variables into other numeric
variables.
In this case the source variables are filled with spaces, due to a
redefine (see code below).
Example program:
WORKING-STORAGE SECTION.
01 W-RECORD-STRUCTURE.
05 W-RECORD.
10 W-RECORD-TYPE PIC X(03) VALUE SPACE.
10 W-RECORD-DATA PIC X(97) VALUE SPACE.
10 W-RECORD-1 REDEFINES W-RECORD-DATA.
15 W-RECORD-1-ALPHA1 PIC X(02).
15 W-RECORD-1-ALPHA2 PIC X(09).
15 W-RECORD-1-NUM1 PIC 9(05).
15 W-RECORD-1-ALPHA3 PIC X(04).
15 W-RECORD-1-NUM2 PIC 9(06).
15 W-RECORD-1-ALPHA4 PIC X(14).
15 W-RECORD-1-FILLER PIC X(57).
10 W-RECORD-2 REDEFINES W-RECORD-DATA.
15 W-RECORD-2-ALPHA1 PIC X(09).
15 W-RECORD-2-ALPHA2 PIC X(04).
15 W-RECORD-2-NUM1 PIC 9(04).
15 W-RECORD-2-ALPHA3 PIC X(02).
15 W-RECORD-2-NUM2 PIC 9(05).
15 W-RECORD-2-ALPHA4 PIC X(10).
15 W-RECORD-2-FILLER PIC X(63).
01 W-FIELDS.
05 W-VAL1 PIC 9(05).
05 W-VAL2 PIC 9(03)V9(02).
05 W-VAL3 PIC 9(09).
05 W-VAL4 PIC 9(11)V9(02).
05 W-VAL5 PIC S9(05).
05 W-VAL6 PIC S9(03)V9(02).
05 W-VAL7 PIC S9(09).
05 W-VAL8 PIC S9(11)V9(02).
05 W-VAL9 PIC 9(05) COMP-3.
05 W-VAL10 PIC 9(03)V9(02) COMP-3.
05 W-VAL11 PIC 9(09) COMP-3.
05 W-VAL12 PIC 9(11)V9(02) COMP-3.
05 W-VAL13 PIC S9(05) COMP-3.
05 W-VAL14 PIC S9(03)V9(02) COMP-3.
05 W-VAL15 PIC S9(09) COMP-3.
05 W-VAL16 PIC S9(11)V9(02) COMP-3.
PROCEDURE DIVISION.
MOVE 'TYPSOMEDATA' TO W-RECORD.
**** Let's have a look on how W-RECORD-1 looks after this MOVE
DISPLAY 'W-RECORD-1-ALPHA1 [' W-RECORD-1-ALPHA1 ']'.
DISPLAY 'W-RECORD-1-ALPHA2 [' W-RECORD-1-ALPHA2 ']'.
DISPLAY 'W-RECORD-1-NUM1 [' W-RECORD-1-NUM1 ']*'.
DISPLAY 'W-RECORD-1-ALPHA3 [' W-RECORD-1-ALPHA3 ']'.
DISPLAY 'W-RECORD-1-NUM2 [' W-RECORD-1-NUM2 ']*'.
DISPLAY 'W-RECORD-1-ALPHA4 [' W-RECORD-1-ALPHA4 ']'.
**** How do the W-VAL*-variables look before any change
DISPLAY 'W-VAL1 [' W-VAL1 '] before'.
DISPLAY 'W-VAL2 [' W-VAL2 '] before'.
DISPLAY 'W-VAL3 [' W-VAL3 '] before'.
DISPLAY 'W-VAL4 [' W-VAL4 '] before'.
DISPLAY 'W-VAL5 [' W-VAL5 '] before'.
DISPLAY 'W-VAL6 [' W-VAL6 '] before'.
DISPLAY 'W-VAL7 [' W-VAL7 '] before'.
DISPLAY 'W-VAL8 [' W-VAL8 '] before'.
DISPLAY 'W-VAL9 [' W-VAL9 '] before'.
DISPLAY 'W-VAL10 [' W-VAL10 '] before'.
DISPLAY 'W-VAL11 [' W-VAL11 '] before'.
DISPLAY 'W-VAL12 [' W-VAL12 '] before'.
DISPLAY 'W-VAL13 [' W-VAL13 '] before'.
DISPLAY 'W-VAL14 [' W-VAL14 '] before'.
DISPLAY 'W-VAL15 [' W-VAL15 '] before'.
DISPLAY 'W-VAL16 [' W-VAL16 '] before'.
**** Now we take the 'spaced' numeric variable W-RECORD-1-NUM1
**** to move it to the test variables W-VAL*
MOVE W-RECORD-1-NUM1 TO W-VAL1 .
MOVE W-RECORD-1-NUM1 TO W-VAL2 .
MOVE W-RECORD-1-NUM1 TO W-VAL3 .
MOVE W-RECORD-1-NUM1 TO W-VAL4 .
MOVE W-RECORD-1-NUM1 TO W-VAL5 .
MOVE W-RECORD-1-NUM1 TO W-VAL6 .
MOVE W-RECORD-1-NUM1 TO W-VAL7 .
MOVE W-RECORD-1-NUM1 TO W-VAL8 .
MOVE W-RECORD-1-NUM1 TO W-VAL9 .
MOVE W-RECORD-1-NUM1 TO W-VAL10.
MOVE W-RECORD-1-NUM1 TO W-VAL11.
MOVE W-RECORD-1-NUM1 TO W-VAL12.
MOVE W-RECORD-1-NUM1 TO W-VAL13.
MOVE W-RECORD-1-NUM1 TO W-VAL14.
MOVE W-RECORD-1-NUM1 TO W-VAL15.
MOVE W-RECORD-1-NUM1 TO W-VAL16.
**** How do the W-VAL*-variables look after the moves
DISPLAY 'W-VAL1 [' W-VAL1 '] after'.
DISPLAY 'W-VAL2 [' W-VAL2 '] after'.
DISPLAY 'W-VAL3 [' W-VAL3 '] after'.
DISPLAY 'W-VAL4 [' W-VAL4 '] after'.
DISPLAY 'W-VAL5 [' W-VAL5 '] after'.
DISPLAY 'W-VAL6 [' W-VAL6 '] after'.
DISPLAY 'W-VAL7 [' W-VAL7 '] after'.
DISPLAY 'W-VAL8 [' W-VAL8 '] after'.
DISPLAY 'W-VAL9 [' W-VAL9 '] after'.
DISPLAY 'W-VAL10 [' W-VAL10 '] after'.
DISPLAY 'W-VAL11 [' W-VAL11 '] after'.
DISPLAY 'W-VAL12 [' W-VAL12 '] after'.
DISPLAY 'W-VAL13 [' W-VAL13 '] after'.
DISPLAY 'W-VAL14 [' W-VAL14 '] after'.
DISPLAY 'W-VAL15 [' W-VAL15 '] after'.
DISPLAY 'W-VAL16 [' W-VAL16 '] after'.
Output:
W-RECORD-1-ALPHA1 [SO]
W-RECORD-1-ALPHA2 [MEDATA ]
W-RECORD-1-NUM1 [ ]*
W-RECORD-1-ALPHA3 [ ]
W-RECORD-1-NUM2 [ ]*
W-RECORD-1-ALPHA4 [ ]
W-VAL1 [00000] before
W-VAL2 [00000] before
W-VAL3 [000000000] before
W-VAL4 [0000000000000] before
W-VAL5 [00000+] before
W-VAL6 [00000+] before
W-VAL7 [000000000+] before
W-VAL8 [0000000000000+] before
W-VAL9 [00000] before
W-VAL10 [00000] before
W-VAL11 [000000000] before
W-VAL12 [0000000000000] before
W-VAL13 [00000+] before
W-VAL14 [00000+] before
W-VAL15 [000000000+] before
W-VAL16 [0000000000000+] before
W-VAL1 [ ] after
W-VAL2 [ 00] after
W-VAL3 [0000 ] after
W-VAL4 [000000 00] after
W-VAL5 [ M-`-] after
W-VAL6 [ 00+] after
W-VAL7 [0000 M-`-] after
W-VAL8 [000000 00+] after
W-VAL9 [?0?00] after
W-VAL10 [?0000] after
W-VAL11 [0000?0?00] after
W-VAL12 [000000?0?0000] after
W-VAL13 [?0?00+] after
W-VAL14 [?0000+] after
W-VAL15 [0000?0?00+] after
W-VAL16 [000000?0?0000+] after
Expected Output:
Output:
W-RECORD-1-ALPHA1 [SO]
W-RECORD-1-ALPHA2 [MEDATA ]
W-RECORD-1-NUM1 [ ]*
W-RECORD-1-ALPHA3 [ ]
W-RECORD-1-NUM2 [ ]*
W-RECORD-1-ALPHA4 [ ]
W-VAL1 [00000] before
W-VAL2 [00000] before
W-VAL3 [000000000] before
W-VAL4 [0000000000000] before
W-VAL5 [00000+] before
W-VAL6 [00000+] before
W-VAL7 [000000000+] before
W-VAL8 [0000000000000+] before
W-VAL9 [00000] before
W-VAL10 [00000] before
W-VAL11 [000000000] before
W-VAL12 [0000000000000] before
W-VAL13 [00000+] before
W-VAL14 [00000+] before
W-VAL15 [000000000+] before
W-VAL16 [0000000000000+] before
W-VAL1 [00000] after
W-VAL2 [00000] after
W-VAL3 [000000000] after
W-VAL4 [0000000000000] after
W-VAL5 [00000+] after
W-VAL6 [00000+] after
W-VAL7 [000000000+] after
W-VAL8 [0000000000000+] after
W-VAL9 [00000] after
W-VAL10 [00000] after
W-VAL11 [000000000] after
W-VAL12 [0000000000000] after
W-VAL13 [00000+] after
W-VAL14 [00000+] after
W-VAL15 [000000000+] after
W-VAL16 [0000000000000+] after
cobc (OpenCOBOL) 1.1.0 Build date Apr 23 2008 16:14:56
using the -std=mf flag
HP-UX machinename B.11.31 U ia64 3567537583 unlimited-user license
Thanks for help...
****************************************************************************
Note -
eg. With MF SE 4.x -
simlinux:~ # cob num.cob
simlinux:~ # cobrun num
W-RECORD-1-ALPHA1 [SO]
W-RECORD-1-ALPHA2 [MEDATA ]
W-RECORD-1-NUM1 [ ]*
W-RECORD-1-ALPHA3 [ ]
W-RECORD-1-NUM2 [ ]*
W-RECORD-1-ALPHA4 [ ]
W-VAL1 [ ] before
W-VAL2 [ ] before
W-VAL3 [ ] before
W-VAL4 [ ] before
W-VAL5 [
Execution error : file '/root/num.int'
error code: 163, pc=16E, call=1, seg=0
163 Illegal character in numeric field
or -
simlinux:~ # cob -u num.cob
simlinux:~ # cobrun num
W-RECORD-1-ALPHA1 [SO]
W-RECORD-1-ALPHA2 [MEDATA ]
W-RECORD-1-NUM1 [ ]*
W-RECORD-1-ALPHA3 [ ]
W-RECORD-1-NUM2 [ ]*
W-RECORD-1-ALPHA4 [ ]
W-VAL1 [ ] before
W-VAL2 [ ] before
W-VAL3 [ ] before
W-VAL4 [ ] before
W-VAL5 [00000+] before
W-VAL6 [00000+] before
W-VAL7 [000000000+] before
W-VAL8 [0000000000000+] before
W-VAL9 [20202] before
W-VAL10 [20202] before
W-VAL11 [202020202] before
W-VAL12 [2020202020202] before
W-VAL13 [+20202] before
W-VAL14 [+20202] before
W-VAL15 [+202020202] before
W-VAL16 [+2020202020202] before
W-VAL1 [ ] after
W-VAL2 [ 00] after
W-VAL3 [0000 ] after
W-VAL4 [000000 00] after
W-VAL5 [00000+] after
W-VAL6 [00000+] after
W-VAL7 [000000000+] after
W-VAL8 [0000000000000+] after
W-VAL9 [00000] after
W-VAL10 [00000] after
W-VAL11 [000000000] after
W-VAL12 [0000000000000] after
W-VAL13 [+00000] after
W-VAL14 [+00000] after
W-VAL15 [+000000000] after
W-VAL16 [+0000000000000] after
Roger
.
- References:
- Undefined behaviour
- From: Roger While
- Undefined behaviour
- Prev by Date: Undefined behaviour
- Next by Date: Re: Opinions on approach, please...
- Previous by thread: Undefined behaviour
- Index(es):