For Programmers: Free Programming Magazines  


Home > Archive > Cobol > January 2005 > Overlapping varaibles in cobol language...









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Overlapping varaibles in cobol language...
XPPROGRAMMER

2005-01-28, 3:55 pm

Happy Friday,

just wondering if its ok to overlap constant variables in cobol
language (OO & CharacterBase)? the listed below code have yielded
about 98% success rate with very minor odd results. Does this
approach considered risky to eliminate leading or trailing spaces?
do you see data corruption risk factor as well?
would like to hear your thoughts on this. Thanks.

John.

*>--- overlap Right-2-Left ---------------------*>

01 String1 Pic X(15) Value " ABCDEFGH".
01 WipeOut Pic 9(4) comp-5 value 0.

If String1 <> Space
move 16 to WipeOut
Perform Until String1(1:1) <> Spaces
move String1(2:14) To String1(1:14)
move space to string1(WipeOut - 1:1)
End-Perform
end-if.

*>--- overlap Left-2-Right ---------------------*>

01 String2 Pic X(15) Value "ABCDEFGH ".
01 WipeOut Pic 9(4) comp-5 value 0.

If String2 <> Space
move zeros to WipeOut
Perform Until String2(15:1) <> Spaces
move String2(1:14) To String2(2:14)
move space to string2(WipeOut + 1:1)
End-Perform
end-if.

*>------------------------------------------------*>

Chuck Stevens

2005-01-28, 8:55 pm

Well, hmmm. Let's see what the COBOL standards have to say about this:

ANSI X3.23-1974, page II-51, paragraph 5.3.5, Overlapping operands: When a
sending and a receiving item in an arithmetic statement or an INSPECT, MOVE,
SET, STRING or UNSTRING statement share a part of their storage areas, the
result of the execution of such a statement is undefined.

ANSI X3.23-1985, page VI-69, paragraph 6.4.5, Overlapping Operands: When a
sending and a receiving item in any statement share a part or all of their
storage areas, yet are not defined by the same data description entry, the
result of the execution of such a statement is undefined. ...

ISO/IEC 1989:2002, page 390, paragraph 14.5.9, Overlapping operands: When a
sending and a receiving item in any statement share a part or all of their
storage areas, yet are not defined by the same data description entry, the
result of the execution of such a statement is undefined. ... In the case of
reference modification ... if an overlapping situation exists, the results
of the operation are undefined.

Maybe it does what you want under certain circumstances in your particular
implementation and maybe it doesn't.

Do you *really* think it's a good idea to go there, given the lengths to
which the standards have gone to discourage such code over the last
thirty-one years? Are you *really* surprised at the "very minor odd
results"?

-Chuck Stevens


"XPPROGRAMMER" <saud_abraham@hotmail.com> wrote in message
news:1106938614.280367.156600@z14g2000cwz.googlegroups.com...
> Happy Friday,
>
> just wondering if its ok to overlap constant variables in cobol
> language (OO & CharacterBase)? the listed below code have yielded
> about 98% success rate with very minor odd results. Does this
> approach considered risky to eliminate leading or trailing spaces?
> do you see data corruption risk factor as well?
> would like to hear your thoughts on this. Thanks.
>
> John.
>
> *>--- overlap Right-2-Left ---------------------*>
>
> 01 String1 Pic X(15) Value " ABCDEFGH".
> 01 WipeOut Pic 9(4) comp-5 value 0.
>
> If String1 <> Space
> move 16 to WipeOut
> Perform Until String1(1:1) <> Spaces
> move String1(2:14) To String1(1:14)
> move space to string1(WipeOut - 1:1)
> End-Perform
> end-if.
>
> *>--- overlap Left-2-Right ---------------------*>
>
> 01 String2 Pic X(15) Value "ABCDEFGH ".
> 01 WipeOut Pic 9(4) comp-5 value 0.
>
> If String2 <> Space
> move zeros to WipeOut
> Perform Until String2(15:1) <> Spaces
> move String2(1:14) To String2(2:14)
> move space to string2(WipeOut + 1:1)
> End-Perform
> end-if.
>
> *>------------------------------------------------*>
>



Howard Brazee

2005-01-28, 8:55 pm


On 28-Jan-2005, "XPPROGRAMMER" <saud_abraham@hotmail.com> wrote:

> just wondering if its ok to overlap constant variables in cobol
> language (OO & CharacterBase)? the listed below code have yielded
> about 98% success rate with very minor odd results. Does this
> approach considered risky to eliminate leading or trailing spaces?
> do you see data corruption risk factor as well?
> would like to hear your thoughts on this. Thanks.


In the olden dayze, IBM's compiler would not handle tables that were big enough
for many people's use. So we reserved space and then went outside of tables:

01 My-Table.
05 My Record pic x(80) occurs 5000.
01 Do-not-move-this
05 filler pic x(80) occurs 5000.

It was reliable enough to work in many shops, but was vulnerable to a re-compile
with an optimizing compiler (which can move things around in working storage).
Nowadays, we have plenty of room and don't need this. I recommend that
everybody checks to see if their compiler has a switch to allow for boundary
testing, so that if you go outside of your table, you abort with a boundary
error. It doesn't cost much and can save you from complicated problems.

If you *really* need to do what you are doing, use redefines and group levels.
XPPROGRAMMER

2005-01-28, 8:55 pm

Yes. I was really surprised --- the code is legitimely optimized and
adhering to the language's rules. I am more concerned about
execution thrashing on the compiler's part or possible data loss.
performance wise, the code ran very fast even when the length of
string1 & string2 was modified to pic x(1024) value spaces.

John.

William M. Klein

2005-01-28, 8:55 pm

Just so you know, in COBOL there is no guarantee that 2 01-levels that are next
to each other in source code - will actually be next to each other in storage.
(In the case of EXTERNAL, they probably will NOT be). If they are next to each
other, there is also no guarantee what "boundaries" (if any) they will be on -
so how many bits/bytes will be between them.

Bottom-Line:
What you code will work exactly how it works - no guarantees that it will
work the same way tomorrow much less with a different compiler (or "fix-level"
of the compiler).

--
Bill Klein
wmklein <at> ix.netcom.com
"XPPROGRAMMER" <saud_abraham@hotmail.com> wrote in message
news:1106938614.280367.156600@z14g2000cwz.googlegroups.com...
> Happy Friday,
>
> just wondering if its ok to overlap constant variables in cobol
> language (OO & CharacterBase)? the listed below code have yielded
> about 98% success rate with very minor odd results. Does this
> approach considered risky to eliminate leading or trailing spaces?
> do you see data corruption risk factor as well?
> would like to hear your thoughts on this. Thanks.
>
> John.
>
> *>--- overlap Right-2-Left ---------------------*>
>
> 01 String1 Pic X(15) Value " ABCDEFGH".
> 01 WipeOut Pic 9(4) comp-5 value 0.
>
> If String1 <> Space
> move 16 to WipeOut
> Perform Until String1(1:1) <> Spaces
> move String1(2:14) To String1(1:14)
> move space to string1(WipeOut - 1:1)
> End-Perform
> end-if.
>
> *>--- overlap Left-2-Right ---------------------*>
>
> 01 String2 Pic X(15) Value "ABCDEFGH ".
> 01 WipeOut Pic 9(4) comp-5 value 0.
>
> If String2 <> Space
> move zeros to WipeOut
> Perform Until String2(15:1) <> Spaces
> move String2(1:14) To String2(2:14)
> move space to string2(WipeOut + 1:1)
> End-Perform
> end-if.
>
> *>------------------------------------------------*>
>



Chuck Stevens

2005-01-28, 8:55 pm

"William M. Klein" <wmklein@nospam.netcom.com> wrote in message
news:c4yKd.339874$f47.64860@news.easynews.com...
> Just so you know, in COBOL there is no guarantee that 2 01-levels that are

next
> to each other in source code - will actually be next to each other in

storage.
> (In the case of EXTERNAL, they probably will NOT be). If they are next to

each
> other, there is also no guarantee what "boundaries" (if any) they will be

on -
> so how many bits/bytes will be between them.


.... and in Unisys MCP COBOL74 you can pretty much guarantee that they
*won't* be next to each other. Each 01 is a separate block of memory
allocated by the system the first time it's referenced during execution. If
it happens never to be referenced, it never occupies memory at all.

-Chuck Stevens


JerryMouse

2005-01-28, 8:55 pm

XPPROGRAMMER wrote:
> Happy Friday,
>
> just wondering if its ok to overlap constant variables in cobol
> language (OO & CharacterBase)? the listed below code have yielded
> about 98% success rate with very minor odd results. Does this
> approach considered risky to eliminate leading or trailing spaces?
> do you see data corruption risk factor as well?
> would like to hear your thoughts on this. Thanks.


You can hone your code with this technique such that you achieve 99.98%
success. Someday you die.

>
> John.
>
> *>--- overlap Right-2-Left ---------------------*>
>
> 01 String1 Pic X(15) Value " ABCDEFGH".
> 01 WipeOut Pic 9(4) comp-5 value 0.
>
> If String1 <> Space
> move 16 to WipeOut
> Perform Until String1(1:1) <> Spaces
> move String1(2:14) To String1(1:14)
> move space to string1(WipeOut - 1:1)
> End-Perform
> end-if.


This will work, though there are easier ways to do it. Little Used Rule: You
may move a variable to a subset of itself if the receiving starting byte is
to the left of the sending starting byte. Corallary: Those who come after
you will think you mad.

>
> *>--- overlap Left-2-Right ---------------------*>
>
> 01 String2 Pic X(15) Value "ABCDEFGH ".
> 01 WipeOut Pic 9(4) comp-5 value 0.
>
> If String2 <> Space
> move zeros to WipeOut
> Perform Until String2(15:1) <> Spaces
> move String2(1:14) To String2(2:14)
> move space to string2(WipeOut + 1:1)
> End-Perform
> end-if.
>
> *>------------------------------------------------*>


Important Rule: You can't move a variable to itself if the receiving area is
to the right of the sending area.

Because moves are done a byte at a time. When you get to the second byte to
move, it's already been replaced by the 1st byte.

Assume "X" = "ABCDEFbbbb" and you want the result to be "bABCDEFbbb"

Move X(1:) to X(2:) would work IF the machine moved strings as a single
entity. Since compilers generate byte moves, after the first byte move X=
AACDEFbbbb. Then the machine moves the second byte and you get X=AAADEFbbbb
and so on.

Basic Rule: The sending and receiving fields in any operation shall not be
the same. Abuse this rule at your peril - as in
pitchforks-and-torches-peril.


Chuck Stevens

2005-01-28, 8:55 pm


"JerryMouse" <nospam@bisusa.com> wrote in message
news:10vlhg52r4hke45@news.supernews.com...

> Little Used Rule: You
> may move a variable to a subset of itself if the receiving starting byte

is
> to the left of the sending starting byte.


In some implementations. In other implementations the hardware instructions
may impose other restrictions or disallow it altogether. In the case of
Unisys MCP systems, for the results to be predictable with overlapping
operands on such a MOVE, the source and destination "pointers" need to be
more than 8 bytes apart.

One of the reasons this might be a Little Used Rule is that following it
will Hose Your Data if you try it anywhere but the System Upon Which This
Little Used Rule Applies! ;-)

See aforementioned standards references ...

-Chuck Stevens


James J. Gavan

2005-01-29, 3:55 am

XPPROGRAMMER wrote:
> Happy Friday,
>
> just wondering if its ok to overlap constant variables in cobol
> language (OO & CharacterBase)? the listed below code have yielded
> about 98% success rate with very minor odd results. Does this
> approach considered risky to eliminate leading or trailing spaces?
> do you see data corruption risk factor as well?
> would like to hear your thoughts on this. Thanks.


Are you just dabbling or do you *really* want 100% success. I'm not
going to re-post here, but check M/F Answer Exchange for a message I
posted on "Stringing Examples'. (A slightly earlier version is here if
you check the c.l.c. archives). It uses OO to get rid of 'pre' and
'after' white space. I haven't done any volume tests on it, but would
suggest ACCURACY is more important than speed.

Just to be sure, I changed the program to accept your two versions of
text and it returned a display of 'ABCDEFGH' in both cases, plus the
resulting StringLength of 8 chars.

Jimmy, Calgary AB
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com