|
On Tue, 26 Nov 2002, JJW wrote: > > Dow (%scan(C1:F1) > *Zeros) AND (%scan(C1:F1) <= InLen); > %subst(F1:1:InLen) = %replace('':F1:%scan(C1:F1):1); > > F1 = %replace(' ':F1:InLen:1); > > endDO; > Any time you have a 'F1 = <anything>' in your subprocedure, and F1 is a *VARSIZE parameter, you will have problems. Why is that? Okay, I'll explain. The 'eval' op-code (Which is what you're using here, it's implied in a free form statement that has no op-code) always sets every character when you do an assignment. For example, if you have a 25A variable, and you do: My_25A = 'X'; The eval op-code not only sets the first character to an X, it also sets the other 24 characters to spaces. That's a problem with a *VARSIZE variable, because the compiler doesn't actually know the length of the variable. If you have a 32766A which is *VARSIZE, then the compiler ALWAYS treats it as if it's 32766 bytes long. It doesn't matter that you only passed 10 bytes, it still thinks it's 32766 bytes long. So, if you've passed a 10A as a 32766A *VARSIZE, and do a F1 = 'X'; It sets the first byte to an X. It also sets the other 32765 bytes to blanks. Since you only passed 10 bytes, you are overwriting 32755 bytes with blanks which don't belong to you. Those bytes could be ANYTHING. It might end up having no effect, but then again, it might end up causing mass chaos, including program crashes that are extremely difficult to track down. Therefore, I'll say it again. If you use *VARSIZE, don't EVER do an F1 = <anything> That's why you need to use %subst(F1:1:InLen) = <anything> That way, you're telling the compiler 'ONLY work with InLen bytes of my variable!'
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.