View previous topic :: View next topic
|
Author |
Message |
shankarm
Active User
Joined: 17 May 2010 Posts: 175 Location: India
|
|
|
|
Hello,
In the below code,
the value of D-CNTR is zero. The below code gets into indifinite loop, i dont understand why? Please help.
It should not go into the loop correct? since WS-CNTR (Value '1') is greater than D-CNTR ( valur '0')?
Code: |
05 D-CNTR PIC 9(04) COMP.
05 WS-CNTR PIC 9(08) VALUE ZEROES.
PERFORM VARYING WS-CNTR FROM 1 BY 1 UNTIL
WS-CNTR > D-CNTR
.
.
.
End-perform.
|
|
|
Back to top |
|
|
Ed Goodman
Active Member
Joined: 08 Jun 2011 Posts: 556 Location: USA
|
|
|
|
I agree that it SHOULD behave like you expect. That leaves the possibility that the value in D-CNTR really isn't zero.
Without trying it myself for fun, I can't even remember if the loop would execute even once. |
|
Back to top |
|
|
Nic Clouston
Global Moderator
Joined: 10 May 2007 Posts: 2455 Location: Hampshire, UK
|
|
|
|
Does it not depend on what the default is (WITH TEST BEFORE or AFTER). With AFTER it will execute once. |
|
Back to top |
|
|
agkshirsagar
Active Member
Joined: 27 Feb 2007 Posts: 691 Location: Earth
|
|
|
|
Regardless of the value in D-CNTR, it should not go to infinite loop.
Maximum value that can be stored in 9(4) COMP is 32767. It should loop for those many times and exit.
That leaves for one possibility. Are you manipulating the counters inside perform? Can you cut and paste your exact code? |
|
Back to top |
|
|
Ed Goodman
Active Member
Joined: 08 Jun 2011 Posts: 556 Location: USA
|
|
|
|
I agree that it SHOULD behave like you expect. That leaves the possibility that the value in D-CNTR really isn't zero.
Without trying it myself for fun, I can't even remember if the loop would execute even once.
I would add a display on that D-CNTR field just to sure it's really zero. |
|
Back to top |
|
|
Bill Woodger
Moderator Emeritus
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
|
|
|
|
Nic, yes, it does depend. Default is BEFORE, so should not execute even once if termination condition is satisfied.
agkshirsagar, how many times it should go through the loop will depending on the compiler option TRUNC. The field is unsigned, so the maximum if treated as COMP-5, that is, with TRUNC(BIN), is 65,535. If TRUNC(STD) or TRUNC(OPT) the maximum is 9999. However, for this purpose, the results should be the same - no loop.
shankarm, you do need to show the rest of your code inside the PERFORM. That is likely where the problem is. Other things are possible, but check the most likely first. |
|
Back to top |
|
|
chandan.inst
Active User
Joined: 03 Nov 2005 Posts: 275 Location: Mumbai
|
|
|
|
Hi,
I tested Code with what you have mentioned.
Its not going in loop for me
It will be great if show us whoile piece of code
How about displaying D-CNTR before loop starts?
Regards,
Chandan |
|
Back to top |
|
|
dick scherrer
Moderator Emeritus
Joined: 23 Nov 2006 Posts: 19244 Location: Inside the Matrix
|
|
|
|
Hello,
Quote: |
In the below code,
the value of D-CNTR is zero. |
I don't think so . . .
The field is uninitialized and may contain anything . . .
Something else may be modifying WS-CNTR or D-CNTR causing the loop. . . |
|
Back to top |
|
|
shankarm
Active User
Joined: 17 May 2010 Posts: 175 Location: India
|
|
|
|
Code: |
PERFORM VARYING WS-CNTR FROM 1 BY 1 UNTIL
WS-CNTR > D-CNTR
MOVE 'N' TO RPT-FLAG
MOVE SPACES TO SING-NME
MOVE HD-D-FILG-NME(WS-CNTR) TO SING-NME
MOVE +120 TO SING-LENGTH
CALL 'TRDSNGLE' USING SING-NME, SING-LENGTH
MOVE SPACES TO WS-DEF-NME
MOVE SING-NME TO WS-DEF-NME
IF WS-CNTR <= D-CNTR
PERFORM VARYING RPT-CNTR FROM 1 BY 1 UNTIL
RPT-CNTR = DEF-CNTR OR RPT-FLAG = 'Y'
IF WS-DEF-NME EQUAL TO MSD-FILG-NME(RPT-CNTR)
MOVE 'Y' TO RPT-FLAG
END-IF
END-PERFORM
END-IF
IF RPT-FLAG EQUAL TO 'N'
ADD 1 TO MDEF-CNTR
MOVE WS-DEF-NME TO MSD-FILG-NME(MDEF-CNTR)
MOVE HD-D-STR-ADR(WS-CNTR) TO
MSD-FILG-STR-ADR(MDEF-CNTR)
MOVE HD-D-CITY-NME(WS-CNTR) TO
MSD-FILG-CITY-NME(MDEF-CNTR)
MOVE HD-D-ST-NME(WS-CNTR) TO
MSD-FILG-ST-NME(MDEF-CNTR)
MOVE HD-D-POST-CD(WS-CNTR) TO
MSD-FILG-POST-CD(MDEF-CNTR)
MOVE WS-CAUSE-CD TO MSU-CAUSE-CD(MDEF-CNTR)
MOVE WS-CAUSE-DESC TO MSU-CAUSE-DESC(MDEF-CNTR)
IF DEF-CNTR <= 14
MOVE WS-DEF-NME TO SD-FILG-NME(DEF-CNTR)
MOVE HD-D-STR-ADR(WS-CNTR) TO
SD-FILG-STR-ADR(DEF-CNTR)
MOVE HD-D-CITY-NME(WS-CNTR) TO
SD-FILG-CITY-NME(DEF-CNTR)
MOVE HD-D-ST-NME(WS-CNTR) TO
SD-FILG-ST-NME(DEF-CNTR)
MOVE HD-D-POST-CD(WS-CNTR) TO
SD-FILG-POST-CD(DEF-CNTR)
MOVE WS-CAUSE-CD TO SU-CAUSE-CD(DEF-CNTR)
MOVE WS-CAUSE-DESC TO SU-CAUSE-DESC(DEF-CNTR)
ADD 1 TO DEF-CNTR
END-IF
ELSE
MOVE WS-DEF-NME TO WS-ERR-VAL
MOVE SPACES TO WS-FILING-LOC
MOVE WS-COMM-KEY TO WS-FILING-NUM
MOVE '10' TO ERR-TYP
ADD 1 TO WS-COUNTF10, WS-SUM-F
ADD 1 TO ERR-CNTR
MOVE '10' TO WS-ERR-VALUE
MOVE SPACES TO WS-INPUT
MOVE HD-D-FULLREC(WS-CNTR) TO WS-INPUT
WRITE ERROR-REC FROM WS-ERROUT-REC
PERFORM 0460-FL-ERR-PARA THRU
0460-FL-ERR-PARA-EXIT
END-IF
END-PERFORM.
0460-FL-ERR-PARA.
MOVE 'F' TO WS-ERR-TYPE
EVALUATE ERR-TYP
WHEN '8' MOVE 'INVALID CAUSE OF ACTION ' TO WS-ERR-MSG
MOVE WS-PNUM TO WS-FILING-LOC
WHEN '10' MOVE 'EXACT DUPLICATE ' TO WS-ERR-MSG
MOVE WS-PNUM TO WS-FILING-LOC
WHEN OTHER
MOVE SPACES TO WS-ERR-MSG
END-EVALUATE.
PERFORM 0490-SEARCH-ERR-TBL THRU
0490-SEARCH-ERR-TBL-EXIT.
0460-FL-ERR-PARA-EXIT.
EXIT. |
|
|
Back to top |
|
|
shankarm
Active User
Joined: 17 May 2010 Posts: 175 Location: India
|
|
|
|
I gave display outside the loop for D-cntr and inside the loop for WS-CNTR
Output:
Code: |
D-CNTR0000
WS-CNTR00000001
WS-CNTR00000002
WS-CNTR00000003
WS-CNTR00000004
WS-CNTR00000005
WS-CNTR00000006
WS-CNTR00000007
WS-CNTR00000008
WS-CNTR00000009
WS-CNTR00000010
.
.
.
.
.
.
And gives a S0c4.. |
|
|
Back to top |
|
|
shankarm
Active User
Joined: 17 May 2010 Posts: 175 Location: India
|
|
|
|
TRDSNGLE is not editing D-cntr.. |
|
Back to top |
|
|
Bill Woodger
Moderator Emeritus
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
|
|
|
|
You need to show the definitions, as what you have shown so far has "05" levels, and we need to see everything that is part of the 01(s) that those fields are part of. |
|
Back to top |
|
|
Bill Woodger
Moderator Emeritus
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
|
|
|
|
Code: |
PERFORM 0490-SEARCH-ERR-TBL THRU
0490-SEARCH-ERR-TBL-EXIT. |
This we need to see.
Also show where you put the DISPLAYs? |
|
Back to top |
|
|
Bill Woodger
Moderator Emeritus
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
|
|
|
|
It looks like you have compiler option TRUNC(STD) or TRUNC(OPT). Can you confirm which, please?
TRUNC(OPT) I'd guess. Can you
Code: |
05 D-X REDEFINES D-CNTR PIC XX. |
And
Code: |
DISPLAY
">"
D-X
"<"
|
At the same time as your DISPLAY of D-CNTR.
Use SET HEX ON and paste the result of the new DISPLAY.
Is this some of the "old" code you support, or something you've written yourself? |
|
Back to top |
|
|
agkshirsagar
Active Member
Joined: 27 Feb 2007 Posts: 691 Location: Earth
|
|
|
|
Getting a S0C4 is not the same as infinite loop. Which one it is?
If you printed the value before the perform loop and D-CNTR was zero, it should have never entered in the loop. |
|
Back to top |
|
|
Bill Woodger
Moderator Emeritus
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
|
|
|
|
agkshirsagar wrote: |
Getting a S0C4 is not the same as infinite loop. Which one it is?
If you printed the value before the perform loop and D-CNTR was zero, it should have never entered in the loop. |
Those two things are what make it interesting :-) |
|
Back to top |
|
|
prino
Senior Member
Joined: 07 Feb 2009 Posts: 1306 Location: Vilnius, Lithuania
|
|
|
|
Load the program in Debug Tool (or Xpediter), add a breakpoint on any changes of key variables and run it.
Use the flucking tools that are made to debug code, don't waste time fluffing around on forums giving information in piecemeal snippets. |
|
Back to top |
|
|
don.leahy
Active Member
Joined: 06 Jul 2010 Posts: 765 Location: Whitby, ON, Canada
|
|
|
|
prino wrote: |
Load the program in Debug Tool (or Xpediter), add a breakpoint on any changes of key variables and run it.
Use the flucking tools that are made to debug code, don't waste time fluffing around on forums giving information in piecemeal snippets. |
I like to tell people "Don't waste time speculating on what the code might be doing, or what it ought to be doing. Find out what it is really doing". |
|
Back to top |
|
|
Bill Woodger
Moderator Emeritus
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
|
|
|
|
Already adding code has changed the symptoms (apparently).
Re-compiling it for debugging may cause it to "work" :-)
For anyone who wants to know what it is doing, it is getting into the PERFORM when - on the face of it - it shouldn't.
Given that, it becomes "easy", with al the information. Which we lack.
shankarm is not so hot on the "feedback" througjh past expeience. He perhaps already has his solution. |
|
Back to top |
|
|
|